構造体型をポインターとして使用する場合 (つまり、ポインター レシーバーを使用すると、コンストラクターが A など)、構造体 (B として) を埋め込むか、そのポインター (B として) を埋め込むかの選択は、微妙ですが重要な結果をもたらします。
ゼロ値
2 つのオプションのゼロ値は大きく異なります。埋め込み B は、値が 0 の埋め込みオブジェクトを直接作成します。これにより、そのオブジェクトに対する即時操作が可能になります。<code class="go">type AObj struct { B } var aObj AObj aObj.Print() // Prints 0 (B's zero value)</code>対照的に、*B を埋め込むと、値が nil ポインタでゼロになり、直接使用できなくなります。
<code class="go">type APtr struct { *B } var aPtr APtr aPtr.Print() // Panics (nil pointer dereference)</code>
Copying
オブジェクトのコピー動作は、埋め込みタイプによって異なります。 B がオブジェクトとして埋め込まれている場合、コピー時に新しいオブジェクトが作成されます。<code class="go">type AObj struct { B } aObj2 := aObj aObj.X = 1 aObj2.Print() // Prints 0 (copy of B's zero value)</code>逆に、ポインタ埋め込み (*B) では、元のオブジェクトとコピーされたオブジェクトの両方が同じ基礎となる B オブジェクトを共有するため、同期が可能になります。変更点:
<code class="go">type APtr struct { *B } aPtr.B = &B{} aPtr2 := aPtr aPtr.X = 1 aPtr2.Print() // Prints 1 (shared underlying B)</code>これらの違いは、コードの可読性、保守性、パフォーマンスの最適化に実際的な影響を及ぼします。構造体の埋め込みとポインターの埋め込みの微妙なニュアンスを理解することで、開発者は潜在的な落とし穴を積極的に回避し、特定のユースケースに最も適切なアプローチを活用できます。
以上が埋め込み構造体と構造体へのポインタ: ゼロ値とコピーはどうなりますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。