ホームページ >バックエンド開発 >Golang >これらの構造物の舞台裏では何が起こっているのでしょうか?構造体はコピーされるのでしょうか?

これらの構造物の舞台裏では何が起こっているのでしょうか?構造体はコピーされるのでしょうか?

PHPz
PHPz転載
2024-02-05 23:27:03902ブラウズ

这些结构的幕后发生了什么? struct 会被复制吗?

質問内容

このコードで何が起こっているのか理解できません。

レシーバ関数は元の構造体 user で動作するため (ポインタのため)、関数内で元の obj を変更します。しかし、構造アドレスもオリジナルですか、それとも元の「a」のコピーですか?

リーリー

これは私の出力です

リーリー

このことから、u.address が変更されていることが分かります。また、「u」内の「a」が元の obj とは異なっていることがわかります。 では、舞台裏やメモリ内では一体何が起こっているのでしょうか? 出力によると、この動作は私にとってまったく予期せぬものでした。 ポインターが存在するため、どちらの場合も元のオブジェクト (「a」と「u」) が使用されると予想していました。 2 回目 (func 'update..' の後) fmt.println(a) を印刷すると、{peremohy kyiv} が得られます。これは、2 回目の fmt.println(u) が {valeriy zalyzhnyi {peremohy kyiv}} を与えるためです。


正解


舞台裏で何が起こっているかを理解するには、コードの動作を視覚化すると役立つ場合があります:

リーリー は次のように細分されます:

リーリー

これで、1 つの

user{}

インスタンスと 2 つの address{} インスタンスにメモリが割り当てられました。 2 番目のアドレス インスタンスの値は、最初のアドレス インスタンス (コピーの作成時) の正確なコピーです。 ここで

updatestreet

を呼び出すと、ポインタを介して u で呼び出されます。user インスタンスのコピーは作成されず、代わりにメモリ上で動作します。アドレス 0x000002 なので、実際には同じ a 変数上で動作します。したがって、式: リーリー 翻訳: メモリ アドレス 0x000002 に保持されている値で、

address

という名前のフィールドにアクセスし、その中のフィールド street にアクセスして新しい値を割り当てます。これを上で作成したテーブルにマッピングしましょう: リーリー 関数が戻った後も、以前と同じオブジェクトがメモリ内の同じ場所にありますが、メモリ内のアドレスを通じて

a

の値にアクセスしたため、updatestreet function u の値が変更されました (同じメモリ アドレスを使用したため)。 変数

a

は、u.address に割り当てられるときに コピーされるため、そのメモリ アドレスが不明であるか、updatestreet 関数に渡されます。したがって、変更されません。

以上がこれらの構造物の舞台裏では何が起こっているのでしょうか?構造体はコピーされるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。