自由気ままにブログ

地方零細企業プログラマがひっそりとなにかしています。

init・無名関数 クロージャを少しだけ触る

f:id:nono138:20200421225921p:plain

またまた、久しぶりの更新です。

実際に結構使える、init関数に付いては、かなりオマケ程度にしか書いていないので、ご了承ください。

 

サンプルコード

package main

import "fmt"

func main() {
    sum := func(num1, num2 intint { //無名関数の定義
        return num1 + num2
    }
    result := sum(105)    //変数sumに対して引数を渡して関数を走らせる
    fmt.Println(result)     //結果 : 15
    fmt.Printf("%T\n", sum) //結果 : func(int, int) int

    clou := clouser("Hello ")
    clou("world")  //結果 : Hello world
    clou("golang"//結果 : Hello golang

    clou2 := clouser("Goodbye ")
    clou2("Work"//結果 : Goodbye Work

}
func clouser(m stringfunc(string) {
    var s string = m

    f := func(n string) {
        fmt.Println(s + n)
    }
    return f
}
func init() {
    fmt.Println("mainより先に呼ばれるよ")
}

 

結果

mainより先に呼ばれるよ
15
func(int, int) int
Hello world
Hello golang
Goodbye Work

解説

無名関数・クロージャjavaScriptを主に扱っている人には馴染みがあるかもしれませんが、Goでも一応、似たような動きが出来ます。

わざわざ使うようにするかは微妙です。

私には、使い道がイマイチ思いつきません。

 

クロージャとは

クロージャクロージャー、英語: closure)、関数閉包はプログラミング言語における関数オブジェクトの一種。いくつかの言語ではラムダ式や無名関数にて利用可能な機能・概念である。引数以外の変数を実行時の環境ではなく、自身が定義された環境(静的スコープ)において解決することを特徴とする。

 自身が定義された環境において解決することとありますが、javaScriptにおいては動的言語であり、型の縛りがありませんので想定外の型が入り、予想外の動きを見せることがあるので、こう言ったクロージャを採用することがあると思いますが、Goは型のある静的言語です。

上記に示したように使い道はよく分かりません。

 

clou := clouser("Hello ")

クロージャ用の関数を(引数:"Hello")で定義しています。

この段階で、自身が定義された環境はstring型の"Hello "を引数としたクロージャ関数の環境を作ったことになりますね。

 

なので、clouにどんな文字列を引数にしても、頭に"Hello "が付きます。

 

init関数においては、結果から分かるように、main関数より先に呼び出される関数になります。

iniファイルの読み込みなどで重宝することが多いと思います。

個人的書き置き場

javaScriptが苦手過ぎるので、クロージャに関してもイマイチな理解な為、間違えていたらご指摘頂けると幸いです。

 

最近仕事では、javaScriptばかりですので、気が向いた時にjavaScriptの事も書けていけたらなと思います。

 

私事ですが、初めてイラスト教本なるものを買ってみたので、ぜひ読み進んで、絵でも描いていきたいなと思ったり、思わなかったり