同じ構造でも、Golang は for ループの defer で異なる動作をします。

WBOY
リリース: 2024-02-06 09:30:11
転載
938 人が閲覧しました

对于同一结构体,Golang 在 for 循环中 defer 的行为有所不同

質問内容

以下のgolangコードを書いて実行してみました。

リーリー

出力:

リーリー

私の理解では、3 つのループの後、ポインター t は "c" を指すため、3 つの 3 "c" が "hello2" 出力に使用されるということです。ただし、「hello」関数呼び出しを遅らせると、非常に奇妙な動作が行われます。指す場所を保持しているようです。 (t 検定) これに影響を与えるにはどうすればよいでしょうか?

golang がこれをどのようにコンパイルするのか興味があります。どうもありがとうございます!


正解


forループでは、deferステートメントのパラメータはクロージャです。クロージャはループ変数 t をキャプチャします。

値レシーバーを使用する呼び出しの場合、クロージャには t のコピーが含まれます。ポインタ レシーバを使用する呼び出しの場合、クロージャには t へのポインタが含まれます。

ループ変数は反復ごとに書き換えられます (この動作は言語の以降のバージョンで変更されます)。したがって、値レシーバー クロージャはすべての値をキャプチャしますが、ポインタ レシーバ クロージャはポインタのみをキャプチャするため、実行時にはそのポインタの最新の値が使用されます。

以上が同じ構造でも、Golang は for ループの defer で異なる動作をします。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:stackoverflow.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!