目次
質問内容
解決策
ホームページ バックエンド開発 Golang クロージャ内に含まれる環境の範囲はどれくらいですか?

クロージャ内に含まれる環境の範囲はどれくらいですか?

Feb 10, 2024 am 11:12 AM
言語を移動

クロージャ内に含まれる環境の範囲はどれくらいですか?

php Xiaobian 閉鎖環境に含まれる環境の範囲とは、閉鎖環境に含まれる要素、要因、条件を指します。閉鎖環境とは、比較的閉鎖的で制限された空間または範囲を指し、研究室や工場のフロアなどの物理空間、またはコンピュータ ネットワークなどの仮想空間を指します。密閉された環境では、温度、湿度、ガス組成などのさまざまな要素を制御および調整して、特定の目的を達成することができます。閉鎖環境は、科学研究の実験、生産および製造などの分野で一般的であり、実験の精度と製品の品質を確保する上で重要な役割を果たしています。

質問内容

クロージャに関するオンラインチュートリアルを真似して、以下のコードを書きました。

リーリー

混乱しています。変数 xvaluef1 := foo1() の実行後にリサイクルされる必要があるようです。したがって、*x を使用するのは間違っているはずです。 , しかし、上記のコードにはエラーはなく、正常に実行され、出力は

になります。 リーリー

それでは、クロージャがポインタ自体に加えてポインタの値も保存するのか、それとも Go 言語のガベージ コレクション メカニズムが xvalue を削除しない原因になっているのかを知りたいのです。

解決策

Go では、クロージャは、それが閉じる変数 (のアドレス) への参照を取得します。引用言語リファレンス:

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

つまり、あなたの例では:

  1. f1 := foo1()

    1. xValue 変数を存在させます (コンパイラーがそれをヒープ上に割り当てる場合があります)。そのタイプのゼロ値 0 から始まります。
    2. 変数 x を存在させ、それに xValue のアドレスを割り当てます。
    3. defer-red クロージャが実行され、値 2 が xValue に割り当てられます。
    4. 変数 x を閉じるクロージャを返します。

    この後者の点は少し注意が必要です。返されたクロージャは変数 x を参照するため、コンパイラは foo が戻った後でも変数が存在することを保証します。 #xx には xValue のアドレスが含まれている (したがって、そのアドレスへのライブ参照である) ため、そのアドレスはまだ存在しており、ガベージ コレクションできません。 コンパイラは、同じエスケープ分析方法を使用して、宣言された関数が返された後も #xxValue が存続することを保証します。

  2. 返されたクロージャを実行すると、そのクロージャへのポインタを介して
  3. xValue

    が変更されます。ここでは魔法は起こりません。他の 2 つの呼び出しは同じ操作を実行します。

  4. 要約すると、C の知識につまずいているかもしれません。関数から制御が返されると、関数内で宣言された変数は存在しなくなるため、関数の外に存在するその変数への参照は無効になります。 Go では、これは当てはまりません。言語は、この点において安全であると明示的に定義されています。コンパイラーは、変数への参照が作成されたときに返される (または通信される) ときに関数呼び出しが行われるように、変数が適切に割り当てられていることを保証します。 。この関数から外部への呼び出しが行われます。

以上がクロージャ内に含まれる環境の範囲はどれくらいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

GOの浮動小数点番号操作に使用されるライブラリは何ですか? GOの浮動小数点番号操作に使用されるライブラリは何ですか? Apr 02, 2025 pm 02:06 PM

GO言語の浮動小数点数操作に使用されるライブラリは、精度を確保する方法を紹介します...

Go's Crawler Collyのキュースレッドの問題は何ですか? Go's Crawler Collyのキュースレッドの問題は何ですか? Apr 02, 2025 pm 02:09 PM

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

GO言語の「VAR」と「タイプ」キーワード定義構造の違いは何ですか? GO言語の「VAR」と「タイプ」キーワード定義構造の違いは何ですか? Apr 02, 2025 pm 12:57 PM

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

GOのどのライブラリが大企業によって開発されていますか、それとも有名なオープンソースプロジェクトによって提供されていますか? GOのどのライブラリが大企業によって開発されていますか、それとも有名なオープンソースプロジェクトによって提供されていますか? Apr 02, 2025 pm 04:12 PM

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

Redisストリームを使用してGO言語でメッセージキューを実装する場合、user_idタイプの変換の問題を解決する方法は? Redisストリームを使用してGO言語でメッセージキューを実装する場合、user_idタイプの変換の問題を解決する方法は? Apr 02, 2025 pm 04:54 PM

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

Goでは、Printlnとstring()関数を備えた文字列を印刷すると、なぜ異なる効果があるのですか? Goでは、Printlnとstring()関数を備えた文字列を印刷すると、なぜ異なる効果があるのですか? Apr 02, 2025 pm 02:03 PM

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

Golandのカスタム構造ラベルが表示されない場合はどうすればよいですか? Golandのカスタム構造ラベルが表示されない場合はどうすればよいですか? Apr 02, 2025 pm 05:09 PM

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

GoおよびViperライブラリを使用するときにポインターを渡す必要があるのはなぜですか? GoおよびViperライブラリを使用するときにポインターを渡す必要があるのはなぜですか? Apr 02, 2025 pm 04:00 PM

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

See all articles