【学習golangシリーズ】クロージャ

[amazonjs asin="B06XJ86BFZ" locale="JP" title="プログラミング経験者がGo言語を本格的に勉強する前に読むための本"]

クロージャとは

今更ながら、クロージャとは「ローカル変数を参照している関数内の関数」のこと。
もはや常識レベルになっているんだろうけど、あまり使いこなせていない。。。
とりあえず、以下例。

package main

import (
    "fmt"
)

func add() func() int {
    // intを返す関数型を返す関数addを定義

    // 初期値
    n := 0

    // int を返す関数型を返す
    return func() int {
        n++
        return n
    }
}

func main(){

    a := add()
    fmt.Println(a())
    // 1
    fmt.Println(a())
    // 2
    fmt.Println(a())
    // 3
}

14行目のreturnのところに書いてあるクロージャの内部で、add関数内の変数nを参照している。

22行目でadd関数をaに代入し、aを実行するたびに数値が増えていく。
これは、aにadd関数内部のローカル変数nを保持された状態で無名関数が実行されるため、数値が増加していく。
クロージャを使わないとグローバル変数を用意する必要が出てくるため、クロージャを使い慣れておくと便利。