ジェネレータ
ジェネレータとは、遅延評価によって値を生成する関数やメソッドのことを指す。ジェネレータは通常、データのシーケンスを逐次的に生成するために使用される。
ジェネレータの実装
GoにはPythonやJavaScriptのような組み込みのジェネレータ機能はないが、チャネルとゴルーチンを使ってジェネレータのような機能を実装することができる。
package main
import "fmt"
// ジェネレータ関数
func fibonacci() chan int {
ch := make(chan int)
go func() {
x, y := 0, 1
for {
ch <- x
x, y = y, x+y
}
}()
return ch
}
func main() {
fib := fibonacci()
for i := 0; i < 10; i++ {
fmt.Println(<-fib)
}
}
説明
fibonacci関数は、整数を生成するチャネルを返す。
ゴルーチン内でフィボナッチ数列を生成し、生成された値をチャネルに送信する。
main関数では、ジェネレータから10個のフィボナッチ数を取得して出力する。
クロージャ
クロージャとは、関数とその関数が作成された環境を合わせたものを指す。クロージャは、関数内で定義された変数を関数外からアクセスできるようにする。
package main
import "fmt"
func incrementor() func() int {
var x int
return func() int {
x++
return x
}
}
func main() {
inc := incrementor()
fmt.Println(inc()) // 1
fmt.Println(inc()) // 2
fmt.Println(inc()) // 3
}
説明
incrementor関数は、整数をインクリメントするクロージャを返す。
xはクロージャの中で保持される変数で、クロージャ内でインクリメントされる。
main関数では、incというクロージャを生成し、呼び出すたびにxがインクリメントされる。
【まとめ】
ジェネレータ
概要: 遅延評価によって値を逐次生成する機能。
実装: Goではチャネルとゴルーチンを用いて実装する。
用途: データのシーケンスを逐次的に生成する。
クロージャ
概要: 関数とその関数が作成された環境を合わせたもの。
特徴: 関数内で定義された変数を関数外からアクセス可能。
用途: 状態の保持やカプセル化。