構造体または構造体へのポインタをポインタとして埋め込む: 主な違い
構造体型 A がポインタ レシーバとコンストラクタのみを持つポインタとして機能する場合A を返し、別の構造体型 B を埋め込む場合は、B を直接埋め込むか、B を埋め込むかの 2 つのオプションがあります。
ゼロ値の違い:
ゼロ値A と B が埋め込まれたものと *B が埋め込まれたものは異なります。 B が直接埋め込まれている場合、A のゼロ値には B の埋め込まれたゼロ値が含まれており、初期化せずに安全に使用できます:
<code class="go">type B struct { X int } func (b *B) Print() { fmt.Printf("%d\n", b.X) } type AObj struct { B } var aObj AObj aObj.Print() // prints 0</code>
ただし、APtr のゼロ値に nil ポインター値を埋め込むと直接使用できなくなります。
<code class="go">type APtr struct { *B } var aPtr APtr aPtr.Print() // panics</code>
オブジェクトのコピー:
オブジェクトは期待どおりにコピーされます。新しい AObj を作成すると、埋め込まれた B がコピーされます:
<code class="go">aObj2 := aObj aObj.X = 1 aObj2.Print() // prints 0, due to the copy</code>
逆に、新しい APtr を作成すると、共有具体オブジェクトを保持して *B がコピーされます:
<code class="go">aPtr.B = &B{} aPtr2 := aPtr aPtr.X = 1 aPtr2.Print() // prints 1, due to shared reference</code>
例:
https://play.golang.org/p/XmOgegwVFeE には、これらの違いを示す実行可能なサンプルが提供されています。
以上が構造体または構造体へのポインタを埋め込む: いつ、そしてなぜ?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。