這個系列會比較簡短,當做便簽使用吧
從官方庫 偷 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" 迭代器主動停止