以下のgolangコードを書いて実行してみました。
リーリー出力:
リーリー私の理解では、3 つのループの後、ポインター t
は "c" を指すため、3 つの 3 "c" が "hello2" 出力に使用されるということです。ただし、「hello」関数呼び出しを遅らせると、非常に奇妙な動作が行われます。指す場所を保持しているようです。 (t 検定)
これに影響を与えるにはどうすればよいでしょうか?
golang がこれをどのようにコンパイルするのか興味があります。どうもありがとうございます!
forループでは、defer
ステートメントのパラメータはクロージャです。クロージャはループ変数 t
をキャプチャします。
値レシーバーを使用する呼び出しの場合、クロージャには t
のコピーが含まれます。ポインタ レシーバを使用する呼び出しの場合、クロージャには t
へのポインタが含まれます。
ループ変数は反復ごとに書き換えられます (この動作は言語の以降のバージョンで変更されます)。したがって、値レシーバー クロージャはすべての値をキャプチャしますが、ポインタ レシーバ クロージャはポインタのみをキャプチャするため、実行時にはそのポインタの最新の値が使用されます。
以上が同じ構造でも、Golang は for ループの defer で異なる動作をします。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。