Go でのイテレータの作成: チャネル vs. クロージャ vs. 名前付き型
Go では、イテレータを作成するためのさまざまなアプローチが存在します。一般的なオプションの 1 つは、イテレータに似たチャネルを利用することです。ただし、チャネルには制限があり、特にプル モデルではなくプッシュ モデルであるため、潜在的なリークが発生します。
慣用的なアプローチには、クロージャの使用が含まれます。次の例は、偶数を生成するイテレータを作成する方法を示しています。
package main import "fmt" func main() { gen := newEven() fmt.Println(gen()) fmt.Println(gen()) fmt.Println(gen()) gen = nil // release for garbage collection } func newEven() func() int { n := 0 return func() int { n += 2 return n } }
別のオプションは、メソッドで名前付き型を使用することです。
package main import "fmt" func main() { gen := even(0) fmt.Println(gen.next()) fmt.Println(gen.next()) fmt.Println(gen.next()) } type even int func (e *even) next() int { *e += 2 return int(*e) }
クロージャと名前付き型の選択は、次によって異なります。特定のニーズ。クロージャは柔軟性を提供しますが、名前付き型はより構造化されたアプローチを提供する可能性があります。
さらに、関数がファーストクラスのオブジェクトであるため、Go ではイテレータの連鎖が簡単です。次の例では、2乗関数を使用して偶数のジェネレーターをチェーンします:
package main import "fmt" func main() { gen := mapInt(newEven(), square) fmt.Println(gen()) fmt.Println(gen()) fmt.Println(gen()) gen = nil // release for garbage collection } type intGen func() int func newEven() intGen { n := 0 return func() int { n += 2 return n } } func mapInt(g intGen, f func(int) int) intGen { return func() int { return f(g()) } } func square(i int) int { return i * i }
以上がGo でイテレータを作成する最良の方法は何ですか: チャネル、クロージャ、または名前付き型?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。