無根生

無根生

公式リポジトリからコードを書く新しい方法を学びました(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) { // 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" を受け取ると、イテレータが自発的に停止します。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。