クロージャ内に含まれる環境の範囲はどれくらいですか?
php Xiaobian 閉鎖環境に含まれる環境の範囲とは、閉鎖環境に含まれる要素、要因、条件を指します。閉鎖環境とは、比較的閉鎖的で制限された空間または範囲を指し、研究室や工場のフロアなどの物理空間、またはコンピュータ ネットワークなどの仮想空間を指します。密閉された環境では、温度、湿度、ガス組成などのさまざまな要素を制御および調整して、特定の目的を達成することができます。閉鎖環境は、科学研究の実験、生産および製造などの分野で一般的であり、実験の精度と製品の品質を確保する上で重要な役割を果たしています。
質問内容
クロージャに関するオンラインチュートリアルを真似して、以下のコードを書きました。
リーリー混乱しています。変数 xvalue
は f1 := foo1()
の実行後にリサイクルされる必要があるようです。したがって、*x
を使用するのは間違っているはずです。 , しかし、上記のコードにはエラーはなく、正常に実行され、出力は
それでは、クロージャがポインタ自体に加えてポインタの値も保存するのか、それとも Go 言語のガベージ コレクション メカニズムが xvalue を削除しない原因になっているのかを知りたいのです。
解決策
Go では、クロージャは、それが閉じる変数 (のアドレス) への参照を取得します。引用言語リファレンス:
関数リテラルはクロージャです。周囲の関数で定義された変数を参照できます。これらの変数は周囲の関数と関数リテラル間で共有され、アクセス可能な限り存続します。
つまり、あなたの例では:
-
f1 := foo1()
-
xValue
変数を存在させます (コンパイラーがそれをヒープ上に割り当てる場合があります)。そのタイプのゼロ値 0 から始まります。 - 変数
x
を存在させ、それにxValue
のアドレスを割り当てます。 -
defer
-red クロージャが実行され、値 2 がxValue
に割り当てられます。 - 変数
x
を閉じるクロージャを返します。
この後者の点は少し注意が必要です。返されたクロージャは変数
x
を参照するため、コンパイラはfoo
が戻った後でも変数が存在することを保証します。 #xxには
xValueのアドレスが含まれている (したがって、そのアドレスへのライブ参照である) ため、そのアドレスはまだ存在しており、ガベージ コレクションできません。 コンパイラは、同じエスケープ分析方法を使用して、宣言された関数が返された後も #xxValue
が存続することを保証します。 返されたクロージャを実行すると、そのクロージャへのポインタを介して -
- xValue
が変更されます。ここでは魔法は起こりません。他の 2 つの呼び出しは同じ操作を実行します。
要約すると、C の知識につまずいているかもしれません。関数から制御が返されると、関数内で宣言された変数は存在しなくなるため、関数の外に存在するその変数への参照は無効になります。 Go では、これは当てはまりません。言語は、この点において安全であると明示的に定義されています。コンパイラーは、変数への参照が作成されたときに返される (または通信される) ときに関数呼び出しが行われるように、変数が適切に割り当てられていることを保証します。 。この関数から外部への呼び出しが行われます。
以上がクロージャ内に含まれる環境の範囲はどれくらいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Go Crawler Collyのキュースレッドの問題は、Go言語でColly Crawler Libraryを使用する問題を調査します。 �...

GO言語で構造を定義する2つの方法:VARとタイプのキーワードの違い。構造を定義するとき、GO言語はしばしば2つの異なる執筆方法を見ます:最初...

大企業または有名なオープンソースプロジェクトによって開発されたGOのどのライブラリが開発されていますか? GOでプログラミングするとき、開発者はしばしばいくつかの一般的なニーズに遭遇します...

redisstreamを使用してGo言語でメッセージキューを実装する問題は、GO言語とRedisを使用することです...

Go言語での文字列印刷の違い:printlnとstring()関数を使用する効果の違いはGOにあります...

Golandのカスタム構造ラベルが表示されない場合はどうすればよいですか?ゴーランドを使用するためにGolandを使用する場合、多くの開発者はカスタム構造タグに遭遇します...

ポインター構文とviperライブラリの使用における問題への取り組みGO言語でプログラミングするとき、特にポインターの構文と使用を理解することが重要です...
