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

Linda Hamilton
リリース: 2024-10-31 06:28:30
オリジナル
233 人が閲覧しました

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!