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>
これらのタイプの新しいオブジェクトを作成する場合、動作は異なります:
選択構造体を直接埋め込むか、ポインターを使用するかは、意図された使用例によって異なります。構造体を埋め込むと、埋め込まれたフィールドに直接アクセスできる便利さが得られますが、ポインターを埋め込むと、埋め込まれた構造体を変更して複数のコピーに影響を与えることができます。これらの影響を理解することで、適切な使用法が保証され、コード内の潜在的な落とし穴を回避できます。
以上がGo に構造体または構造体へのポインタを埋め込む: いつ何を選択する必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。