「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Go に構造体を埋め込む場合: ポインターまたは埋め込み値?

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

2024 年 11 月 15 日に公開
ブラウズ:509

When Embedding Structs in Go: Pointers or Embedded Values?

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

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

ポインタと埋め込み値

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

type Job struct {
    Command string
    *log.Logger
}

ポインターの利点

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

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

ポインター埋め込みの例

type Bitmap struct{
    data [4][5]bool
}

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

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

技術的な制限

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

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3