構造体へのポインターの埋め込みと構造体自体の埋め込み
指定されたシナリオでは、構造体の型 A がポインターであり、ポインター レシーバーのみを含む場合、構造体型 B を B として埋め込むのと *B の間には違いがあります。
ゼロ値の動作
最も明白な違いは次のとおりです。結果として生じる構造のゼロ値。 B をそのまま埋め込むと、型 A のゼロ値には、同じくゼロ値を保持する型 B の埋め込みオブジェクトが含まれます。これにより、事前の初期化なしで埋め込みフィールドをシームレスに使用できるようになります:
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
一方、*B を埋め込むと nil ポインターを持つゼロ値になり、フィールドへの直接アクセスが妨げられます:
type APtr struct { *B } var aPtr APtr aPtr.Print() // panics
フィールド コピー
タイプ A の新しいオブジェクトを作成する場合、フィールド コピーの動作は直感と一致します。 B を埋め込むと、新しいオブジェクト内に埋め込まれたオブジェクトのコピーが作成され、独立性が維持されます。
aObj2 := aObj aObj.X = 1 aObj2.Print() // prints 0, due to a separate instance of B
逆に、*B を埋め込むと、基礎となる具体的なオブジェクトではなくポインターのコピーが作成されます。これは、両方のオブジェクトが同じ B インスタンスを共有し、フィールドの変更に影響を与えることを意味します。
aPtr.B = &B{} aPtr2 := aPtr aPtr.X = 1 aPtr2.Print() // prints 1, as both objects point to the same B
本質的に、B を埋め込むと、含まれる構造体の個別のインスタンスが作成されますが、*B を埋め込むと、複数の埋め込まれた構造間で単一の具体的なインスタンスが共有されます。 。この区別は、ゼロ値のセマンティクスとフィールドのコピーの動作の両方に影響します。
以上がGo で構造体へのポインタを埋め込むのと、構造体自体を埋め込むのはどちらがよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。