構造体型をポインターとして使用する場合 (つまり、ポインター レシーバーを使用する場合、コンストラクターは A など)、構造体 (B として) を埋め込むか、そのポインター (B として) を埋め込むかの選択
ゼロ値
2 つのオプションのゼロ値は大きく異なります。埋め込み B は、値が 0 の埋め込みオブジェクトを直接作成します。これにより、そのオブジェクトに対する即時操作が可能になります。
type AObj struct { B }
var aObj AObj
aObj.Print() // Prints 0 (B's zero value)
対照的に、*B を埋め込むと nil ポインターを持つゼロ値になり、直接使用できなくなります:
type APtr struct { *B }
var aPtr APtr
aPtr.Print() // Panics (nil pointer dereference)
Copying
オブジェクトのコピー動作は、埋め込みタイプによって異なります。 B をオブジェクトとして埋め込む場合、
type AObj struct { B }
aObj2 := aObj
aObj.X = 1
aObj2.Print() // Prints 0 (copy of B's zero value)
逆に、ポインタ埋め込み (*B) を使用すると、元のオブジェクトとコピーされたオブジェクトの両方が同じ基礎となる B オブジェクトを共有し、同期された変更が可能になります:
type APtr struct { *B }
aPtr.B = &B{}
aPtr2 := aPtr
aPtr.X = 1
aPtr2.Print() // Prints 1 (shared underlying B)
これらの違いは、コードの可読性、保守性、パフォーマンスの最適化に実際的な影響を及ぼします。構造体の埋め込みとポインターの埋め込みの微妙なニュアンスを理解することで、開発者は潜在的な落とし穴を積極的に回避し、特定のユースケースに最も適切なアプローチを活用できます。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3