ホームページ  >  記事  >  バックエンド開発  >  同じ構造でも、Golang は for ループの defer で異なる動作をします。

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

WBOY
WBOY転載
2024-02-06 09:30:11938ブラウズ

对于同一结构体,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 までご連絡ください。