这个系列会比较简短,当做便签使用吧
从官方库 偷 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" 迭代器主动停止