型名( iter パッケージ) なし func(yield func() bool) for range f func(yield func(V) bool) for v := range f iter.Seq[V] func(yield func(K, V) bool) for k, v := range f iter.Seq2[K, V] が受け取る引数の数(0〜2個)が、 for range で受け取れる変数の数に対応する。 引数が1個・2個の関数型には、標準の iter パッケージで iter.Seq / iter.Seq2 という型名 が付いている。イテレーターを返す関数の戻り値には、ふつうこの型を使う。 yield 3
ID string // 配下から目的の部署を探す for dept := range root.All() { Children []Department if dept.ID == targetID { } found = dept // All break // は配下の部署を深さ優先ですべて返す func (d Department) All() iter.Seq[Department] { return func(yield func(Department) bool) { for _, c := range d.Children { if !yield(c) { return } 見つかった時点で走査が止まる } } 使う側は探索方法などを気にせず、標準の range 記 法で書くことができる for g := range c.All() { if !yield(g) { return } } } } } 5
error] を返 す API が1つもない os.File.ReadDir のイテレーター版 (golang/go#70084)も、エラーの返し方が決ま らず Open のまま そう言われる理由 全体のエラーも要素ごとのエラーも報告するよい方 法がない 途中終了時の Close も失敗しうるが、 for range は結果を返さないのでループの外で扱うしかない ログやトレースのための context.Context を、 for range が暗黙に呼ぶイテレーターに渡す場所 がない 9
new package for iterators https://github.com/golang/go/issues/61897 golang/go#71901 iter: document general guidance for writing iterator APIs https://github.com/golang/go/issues/71901 golang/go#70084 proposal: os: add iterator variant of File.ReadDir https://github.com/golang/go/issues/70084 Error handling with iterators in Go https://sinclairtarget.com/blog/2025/07/error-handling-with-iterators-in-go/ 12