0
0

GOジェネレータとクロージャについて基本

Last updated at Posted at 2024-08-02

ジェネレータ

ジェネレータとは、遅延評価によって値を生成する関数やメソッドのことを指す。ジェネレータは通常、データのシーケンスを逐次的に生成するために使用される。

napkin-selection (17).png

ジェネレータの実装
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ではチャネルとゴルーチンを用いて実装する。
用途: データのシーケンスを逐次的に生成する。

クロージャ

概要: 関数とその関数が作成された環境を合わせたもの。
特徴: 関数内で定義された変数を関数外からアクセス可能。
用途: 状態の保持やカプセル化。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0