無根生

無根生

從官方庫學到了寫代碼的新方式(1)

這個系列會比較簡短,當做便簽使用吧

從官方庫 xue 到的新的使用方式,最近打算重寫項目,打算從別的庫找找靈感,看看他們是怎麼處理 SSE 的數據流的,看了 gemini golang 的庫,他用到了 iter,Seq2 這個來生成迭代器函數

函數簽名是這樣的

type Seq2[K, V any] func(yield func(K, V) bool)

下面簡單寫一個例子

package main

import (
	"fmt"
	"iter"
)

func iterateArray(a []string) iter.Seq2[string, error] { 
	return func(yield func(string, error) bool) {
		for _, s := range a {
			if s == "exit" {
				yield("", fmt.Errorf("exit")) //返回錯誤並中斷
				return 
			}
			if !yield(s, nil) { // if yield returns false, stop iterating
				return
			}
		}
	}
}

func main() {
	ia := iterateArray([]string{"a", "b", "c", "exit", "d"})
	for k, v := range ia {
		fmt.Println(k, v)
	}
}

當你使用 for range 來遍歷 iterateArray 返回的序列時,for range 循環機制會提供這個 yield 函數。

yield 返回 false 表示 for range 中斷了,停止迭代

當接收到 "exit" 迭代器主動停止

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。