このシリーズは比較的短く、メモとして使ってください。
公式のライブラリから盗んだ 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) { // yieldがfalseを返すと、イテレーションを停止
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" を受け取ると、イテレータが自発的に停止します。