ホームページ  >  記事  >  バックエンド開発  >  Go に構造体を埋め込む場合: ポインターまたは埋め込み値?

Go に構造体を埋め込む場合: ポインターまたは埋め込み値?

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-31 06:28:30214ブラウズ

When Embedding Structs in Go: Pointers or Embedded Values?

構造体の埋め込み: ポインターを優先する場合

ある構造体を別の構造体内に埋め込む場合、ポインターを使用するか、埋め込み値を使用するかの 2 つのオプションがあります。 。この決定を行うには、仕様を理解し、それぞれのアプローチの利点を考慮することが重要です。

ポインタと埋め込み値

Go の仕様によれば、匿名フィールド (埋め込みフィールドとも呼ばれる) は、型名または非インターフェイス型名へのポインターとして宣言できます。つまり、次の例では、Logger フィールドに log.Logger 型を使用するか、ポインタ *log.Logger を使用するかを選択できます。

<code class="go">type Job struct {
    Command string
    *log.Logger
}</code>

ポインタの利点

Eric Urban による記事「Embedding in Go」では、「embed by-pointer」と呼ばれるポインターの埋め込みの利点を強調しています。これらには以下が含まれます:

  • 初期化の柔軟性: NewX イディオムを使用する関数は通常、ポインターによって構造体を返すため、簡単な初期化が可能です。
  • 動的拡張性: ポインターを埋め込むと、構造体をインスタンス化することなく、実行時に埋め込まれたインスタンスを動的に変更できます。これは、Flyweight パターンのようなシナリオに役立ちます。

ポインタ埋め込みの例

<code class="go">type Bitmap struct{
    data [4][5]bool
}

type Renderer struct{
    *Bitmap //Embed by pointer
    on uint8
    off uint8
}</code>

この例では、レンダラー タイプは次の方法でビットマップを埋め込みます。ポインタ。これは、Renderer の複数のインスタンスが Bitmap の 1 つのインスタンスを共有し、その動作を個別にカスタマイズできることを意味します。

技術的な制限

ポインターからポインターを使用できないことに注意することが重要です。または、匿名フィールドとしてのインターフェイスへのポインタ。この制限は、これらの型にはメソッドがないという事実から生じており、これは埋め込みの重要な側面です。メソッドは埋め込み型から埋め込み型に昇格され、直接アクセスできるようになります。

以上がGo に構造体を埋め込む場合: ポインターまたは埋め込み値?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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