ホームページ >バックエンド開発 >Golang >Go で構造体へのポインタを埋め込むのと、構造体自体を埋め込むのはどちらがよいでしょうか?

Go で構造体へのポインタを埋め込むのと、構造体自体を埋め込むのはどちらがよいでしょうか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-03 08:27:30793ブラウズ

When to Embed a Pointer to a Struct vs. the Struct Itself in Go?

構造体へのポインターの埋め込みと構造体自体の埋め込み

指定されたシナリオでは、構造体の型 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。