ホームページ  >  記事  >  バックエンド開発  >  構造体または構造体へのポインタを埋め込む: いつ、そしてなぜ?

構造体または構造体へのポインタを埋め込む: いつ、そしてなぜ?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-01 02:51:27625ブラウズ

Embed a Struct or a Pointer to a Struct: When and Why?

構造体または構造体へのポインタをポインタとして埋め込む: 主な違い

構造体型 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 サイトの他の関連記事を参照してください。

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