2017-09-20 11 views
0

Golangの関数宣言ではなく関数式を使用するのはいつですか?Golangの関数宣言ではなく関数式を使用するのはいつですか?

私はFunction ExpressionとFunction DeclarationをJSで検索しましたが、それは吊り上げに関するものです。 Golangはどうですか?移動中

+0

パッケージ全体の変数または関数が宣言されている場合は、パッケージが宣言される前に使用していても、パッケージの他の場所(およびパッケージがエクスポートされている場合はパッケージの外側)で使用できます。ただし、JavaScriptホイストの詳細はGoには適用されません。 – Gavin

+0

@Gavinあなたの説明は素晴らしいですが、それは関数宣言のような同じ機能を持っていますか? –

答えて

1

無名関数は、様々な場面で利用されています

は - 延期声明

defer func() { 
    // body 
}() 

で - - ゴルーチン

go func() { 
    // body 
}() 

を開始するために別の関数の引数として

err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error { 
    // todo 
}) 

- クロージャー(examples

関数宣言は、関数を名前で参照する場合に使用します。多分あなたのコード内の複数の場所から呼び出すか、それを他のパッケージに公開することができます。

+0

素晴らしい!だから、もし私が言うことができれば、それはすべてシンプルさに関するものですよね? –

+1

私はそれがシンプルさ、表現力そしてコンパクトさについてだと思います。 –

1

1つのユニークな特性がそれぞれにあります:

  • function declarationは、関数に、識別子、関数名を結合します;関数名はidentifierとなります。を参照してください。

  • function literalsは、無名関数を表す。ファンクションリテラルはクロージャは周囲の環境をキャプチャします:それらは周囲の関数で定義された変数を参照することがあります。これらの変数は、周囲の関数と関数リテラルで共有され、アクセス可能な限り生き残ります。

欺かれないでください:関数リテラルが使用されるときはいつでも、宣言された関数も使用できます。

func do() {} 

func main() { 
    go do() 
    defer do() 
} 

は、上記のユニークな特性の他の嘘の上で1つを使用するへの答え:たとえば、次のコードは有効と作業ゴーコードです。

ファンクション宣言は、関数を再利用するときに参照する場合に使用します。これはコードを分離する良い方法でもあり、関数宣言はファイルレベルでなければなりません。別の関数で関数を宣言することはできません。詳細については、Golang nested class inside functionを参照してください。

関数リテラルを使用して、関数がローカル変数やそれを取り囲む他の識別子にアクセスできるようにする場合に使用します。別の関数で関数を宣言することはできないので、ローカル変数と識別子を取得するためのオプションは関数のリテラルです(宣言された関数に引数としてすべて渡す必要がない限り、値を変更してポインタに変換し、アドレスを渡す必要がある場合)。興味深い関連の質問については、Define a recursive function within a function in Goをご覧ください。

関数が名前を持つ必要がなく、関数がローカル変数にアクセスする必要がない場合は、他の(品質の)プロジェクトや以前の経験。関数本体が「小さい」場合は、関数リテラルを使用する方が簡単で簡単です。関数本体が "big"の場合、コードを別の関数として宣言して十分な文書を提供すれば、コードを読みやすく理解することができます。

興味深い/関連するトピックは、関数型の変数であり、関数リテラルまたは宣言された関数を使用して初期化することができます。これは識別子であるため、参照することができ、その値を変更して新しい関数を割り当てることができるという利点があります。例えば

:上記の

func do() { fmt.Println("Doing...") } 

var f = do 

func main() { 
    f() 
    f = func() { fmt.Println("Not doing!") } 
    f() 
} 

が出力(Go Playground上でそれを試してみてください):テストでの機能をあざけるため

Doing... 
Not doing! 

非常に便利です。たとえば、Testing os.Exit scenarios in Go with coverage information (coveralls.io/Goveralls)を参照してください。

関連する問題