Go での構造体の逆参照: コピーと参照の解明
Go では、* 演算子を使用して構造体を逆参照すると、新しいオブジェクトが返されるように見える場合があります。元のアドレスの代わりに構造体のコピー。これは誤解を招く可能性があります。
次のコードを考えてみましょう:
type me struct { color string total int }
このコードでは、me という名前の構造体を定義します。
スタディ関数内で、 me struct p を作成し、その color フィールドを初期化します。次に、&p を使用して p のアドレスを返します。
func study() *me { p := me{} p.color = "tomato" return &p }
main 関数で、p.color のアドレスを取得し、それを &p.color に保存します。次に、p を逆参照し、結果を obj に保存します。
func main() { p := study() obj := *p }
次に、出力を調べてみましょう。
&p.color = 0x10434120 &obj.color = 0x10434140 //different than &p.color!
&p.color と &obj.color を比較すると、次のことがわかります。彼らは異なる住所を持っています。これは、p を逆参照するときに、構造体の新しいコピーを作成することを示唆しているかもしれません。
しかし、これは当てはまりません。 *p を使用すると、p が指す構造体の値がコピーされます。これは、次の使用と同じです。
var obj me = *p
obj は、*p の値に初期化された me 型の新しい変数です。これにより、obj は別のメモリ アドレスを持つようになります。
obj は me 型であり、p は *me 型であることに注意することが重要です。これらは異なる値です。 obj フィールドを変更しても、p 内のフィールドには影響しません。
元の構造体を変更したい場合は、以下を使用できます。
obj := p // equivalent to: var obj *me = p
この場合、obj は同じオブジェクトを指します。 pとしてこれらは異なるアドレスを持っていますが、実際の me オブジェクト内では同じアドレスを保持しています。
以上がGo Structs: 逆参照するとコピーまたは参照が作成されますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。