ホームページ  >  記事  >  バックエンド開発  >  Go への埋め込み: ポインタと値をいつ使用するか?

Go への埋め込み: ポインタと値をいつ使用するか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-02 08:21:29124ブラウズ

Embedding in Go: When to Use a Pointer vs. a Value?

Go での埋め込み: ポインターを使用する場合

構造体を別の構造体内に埋め込む場合、ポインターを使用するか値を使用するかの決定は異なります。

値の使用

値による構造体の埋め込みとは、埋め込まれた構造体のコピーが、それを含む構造体内に格納されることを意味します。これは、次のような状況に適しています。

  • 埋め込まれた構造体は小さく、頻繁にアクセスされます。
  • 実行時に埋め込まれた構造体を動的に変更する必要はありません。
<code class="go">type Job struct {
    Command string
    log.Logger
}</code>

ポインタの使用

ポインタによって構造体を埋め込むと、含まれる構造体の複数のインスタンス間でメモリを共有できます。これは次の場合に役立ちます。

  • 不必要な重複を避けるために大規模または複雑な構造体を埋め込む。
  • 実行時に埋め込まれた構造体への動的な変更を有効にする。
<code class="go">type Job struct {
    Command string
    *log.Logger
}</code>

ポインターによる埋め込みの利点

「ポインターによる埋め込み」という用語は、Eric Urban (「水素 18」) によって作られました。これには、次のような利点があります。

  • NewX イディオムを利用して、参照によって構造体を初期化する関数を使用する。
  • インスタンス化時間を知る必要がなく、型の機能を埋め込む。

ポインターによる埋め込みを使用したフライウェイト パターン

ビットマップ構造体へのポインターを埋め込むことで、複数のレンダラ構造体が同じ基礎となるビットマップ データを共有できるため、メモリ消費が削減され、ランタイムが有効になります。

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

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

ポインターによる埋め込みの制限

匿名フィールドにはメソッドがないため、ポインターへのポインターやインターフェイス型へのポインターを持つことはできません。 。この制限は、インターフェイスへのポインターの誤った使用を防止し、言語の一貫性を維持することを目的としています。

以上がGo への埋め込み: ポインタと値をいつ使用するか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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