从官方库学到了写代码的新方式（1）

这个系列会比较简短，当做便签使用吧

从官方库 偷 xue 到的新的使用方式，最近打算重写项目，打算从别的库找找灵感，看看他们是怎么处理 SSE 的数据流的，看了 gemini golang 的库，他用到了 iter,Seq2 这个来生成迭代器函数

函数签名是这样的

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

下面简单写一个例子

Copy
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" 迭代器主动停止