首頁  >  文章  >  後端開發  >  在 Go 中嵌入結構時:指標還是嵌入值?

在 Go 中嵌入結構時:指標還是嵌入值?

Linda Hamilton
Linda Hamilton原創
2024-10-31 06:28:30221瀏覽

When Embedding Structs in Go: Pointers or Embedded Values?

嵌入結構:何時首選指針

將一個結構嵌入另一個結構時,有兩種選擇:使用指針或嵌入值。為了指導這個決定,了解規範並考慮每種方法的優點非常重要。

指標與嵌入值

根據 Go 規範,匿名欄位(也稱為嵌入欄位)可以宣告為型別名稱或指向非介面類型名稱的指標。這表示您可以選擇在以下範例中為Logger 欄位使用類型log.Logger 或指標*log.Logger:

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

指標的好處

Eric Urban 的文章「Embedding in Go」強調了嵌入指標的優點,即「按指標嵌入」。其中包括:

  • 初始化彈性:使用 NewX 習慣用法的函數通常透過指標傳回結構體,從而允許輕鬆初始化。
  • 動態擴充性:嵌入指標可讓您在執行時間動態變更嵌入實例,而無需實例化結構。這對於享元模式等場景非常有用。

指標嵌入範例

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

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

在此範例中,渲染器類型透過以下方式嵌入點陣圖指標。這意味著 Renderer 的多個實例可以共用單一 Bitmap 實例並獨立自訂其行為。

技術限制

需要注意的是,您不能使用指向指標的指標或作為匿名欄位指向介面的指標。這種限制源於這些類型沒有方法,這是嵌入的關鍵方面。方法從嵌入類型提升為嵌入類型,允許您直接存取它們。

以上是在 Go 中嵌入結構時:指標還是嵌入值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn