ホームページ  >  記事  >  バックエンド開発  >  Go に構造体または構造体へのポインタを埋め込む: いつ何を選択する必要がありますか?

Go に構造体または構造体へのポインタを埋め込む: いつ何を選択する必要がありますか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-30 06:06:03416ブラウズ

 Embed a Struct or a Pointer to a Struct in Go: When Should You Choose What?

構造体の埋め込みとポインターとして使用される構造体への構造体へのポインター

Go では、特にオブジェクト指向で作業する場合、構造体をポインターとして参照する必要があることがよくあります。パターン。ただし、ポインターとして使用される別の構造体内に構造体を埋め込む場合は、構造体自体を埋め込むか、構造体へのポインターを埋め込むかの選択があります。この決定には、コードの動作に影響を与える可能性のある微妙な影響があります。

構造体の埋め込み

次のコードを考えてみましょう。

<code class="go">type B struct {
    X int
}

type A struct {
    B
}</code>

ここでは、B 構造体が構造体内に直接埋め込まれています。構造体。 A のゼロ値には、同じくゼロ値を持つタイプ B の埋め込みオブジェクトが含まれています。その結果、埋め込まれた B オブジェクトの Print メソッドを安全に呼び出すことができます。

<code class="go">var a A
a.Print() // prints 0</code>

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

対照的に、次のコードを考えてみましょう。

<code class="go">type B struct {
    X int
}

type A struct {
    *B
}</code>

ここでは、B 構造体が A 構造体内にポインターとして埋め込まれています。 A のゼロ値には、埋め込まれた *B に対する nil ポインタ値があります。埋め込まれた *B オブジェクトで Print メソッドを呼び出そうとすると、パニックが発生します:

<code class="go">var a A
a.Print() // panics</code>

相違点のコピー

これらのタイプの新しいオブジェクトを作成する場合、動作は異なります:

  • A オブジェクトの場合、埋め込まれた B オブジェクトのコピーが作成されます。つまり、埋め込まれたフィールドに加えられた変更は元のオブジェクトには影響しません。
  • 埋め込まれたポインターを持つ A オブジェクトの場合、コピー*B ポインタが作成されます。つまり、基になる B オブジェクトに加えられた変更は、元のオブジェクトと、同じポインタを共有するコピーの両方に影響します。

結論

選択構造体を直接埋め込むか、ポインターを使用するかは、意図された使用例によって異なります。構造体を埋め込むと、埋め込まれたフィールドに直接アクセスできる便利さが得られますが、ポインターを埋め込むと、埋め込まれた構造体を変更して複数のコピーに影響を与えることができます。これらの影響を理解することで、適切な使用法が保証され、コード内の潜在的な落とし穴を回避できます。

以上がGo に構造体または構造体へのポインタを埋め込む: いつ何を選択する必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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