4

http://en.wikipedia.org/wiki/Closure_(computer_science)で次の定義を見つけました

プログラミング言語では、クロージャー (レキシカル クロージャーまたは関数クロージャーとも呼ばれます) は、関数または関数への参照と、参照環境 (<strong>非ローカル変数 (自由変数またはその関数の値)。 [1] 単純な関数ポインターとは異なり、クロージャーを使用すると、直接のレキシカル スコープの外で呼び出された場合でも、関数は非ローカル変数にアクセスできます。

それはすべての場合に当てはまりますか?ラムダ関数 (クロージャを作成するもの) は、ラムダが呼び出されたときにスコープ外になるローカル変数を参照し続けることはできませんか? これがGOの振る舞いじゃない?


PS:なぜ「ラムダ」という用語を使用するのか、まだ疑問に思っています

これについては答えを得ました https://cstheory.stackexchange.com/questions/18443/lambda-term-usage-in-programming


次の投稿は、他の読者にとって役立つかもしれませんが、

「クロージャー」と「ラムダ」の違いは何ですか?

4

1 に答える 1

6

Go 言語仕様の引用:

関数リテラル

関数リテラルは無名関数を表します。

FunctionLit = "func" Function .
func(a, b int, z float64) bool { return a*b < int(z) }

関数リテラルは、変数に割り当てるか、直接呼び出すことができます。

f := func(x, y int) int { return x + y }
func(ch chan int) { ch <- ACK }(replyChan)

関数リテラルはクロージャーです: 周囲の関数で定義された変数を参照する場合があります。これらの変数は、周囲の関数と関数リテラルの間で共有され、アクセスできる限り存続します。

そうです、Go では、クロージャーは関数リテラルが定義されたスコープ内で可視の任意の変数にアクセスできることが保証されています。Go コンパイラは、スコープ内で「キャプチャされた」変数を認識し、それらを定義コンテキスト スタックの代わりにヒープに強制します (存在する場合は、TLD [最上位宣言] クロージャも存在する可能性があります)。

于 2013-07-24T10:13:33.460 に答える