このコードで何が起こっているのか理解できません。
レシーバ関数は元の構造体 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 番目のアドレス インスタンスの値は、最初のアドレス インスタンス (コピーの作成時) の正確なコピーです。
ここで
を呼び出すと、ポインタを介して u
で呼び出されます。user
インスタンスのコピーは作成されず、代わりにメモリ上で動作します。アドレス 0x000002
なので、実際には同じ a
変数上で動作します。したがって、式:
リーリー
翻訳: メモリ アドレス 0x000002 に保持されている値で、
という名前のフィールドにアクセスし、その中のフィールド street
にアクセスして新しい値を割り当てます。これを上で作成したテーブルにマッピングしましょう:
リーリー
関数が戻った後も、以前と同じオブジェクトがメモリ内の同じ場所にありますが、メモリ内のアドレスを通じて
の値にアクセスしたため、updatestreet
function u
の値が変更されました (同じメモリ アドレスを使用したため)。
変数
は、u.address
に割り当てられるときに コピー
されるため、そのメモリ アドレスが不明であるか、updatestreet 関数に渡されます。したがって、変更されません。
以上がこれらの構造物の舞台裏では何が起こっているのでしょうか?構造体はコピーされるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。