首頁 > 後端開發 > Golang > 在 Go 中嵌入結構體或指向結構體的指標:何時應該選擇什麼?

在 Go 中嵌入結構體或指向結構體的指標:何時應該選擇什麼?

Patricia Arquette
發布: 2024-10-30 06:06:03
原創
544 人瀏覽過

 Embed a Struct or a Pointer to a Struct in Go: When Should You Choose What?

在結構體中嵌入結構體與指向結構體的指針用作指針

在Go 中,通常需要將結構體作為指針引用,特別是在使用物件導向時模式。但是,當將一個結構嵌入到另一個用作指標的結構中時,需要做出選擇:嵌入結構本身或指向它的指標。此決定具有微妙的含義,可能會影響程式碼行為。

嵌入結構體

考慮以下程式碼:

<code class="go">type B struct {
    X int
}

type A struct {
    B
}</code>
登入後複製

這裡,B 結構體直接嵌入到一個結構體中。 A 的零值包括 B 類型的嵌入對象,該對像也有其零值。因此,我們可以安全地呼叫嵌入B 物件的Print 方法:

<code class="go">var a A
a.Print() // prints 0</code>
登入後複製

將指標嵌入結構體

相反,請考慮以下程式碼:

<code class="go">type B struct {
    X int
}

type A struct {
    *B
}</code>
登入後複製

這裡,B 結構體作為指標嵌入A 結構體中。 A 的零值對於嵌入的 *B 有一個 nil 指標值。嘗試對嵌入的*B 物件呼叫Print 方法將導致恐慌:

<code class="go">var a A
a.Print() // panics</code>
登入後複製

複製差異

建立這些類型的新物件時,行為有所不同:

  • 對於A 對象,會建立嵌入的B 物件的副本,這表示對嵌入欄位進行的任何修改都不會影響原始物件。
  • 對於具有嵌入指針的 A 對象,會創建一個副本*B 指針的值被創建,這意味著對底層 B 對象所做的任何修改都會影響原始對象和共享同一指針的任何副本。

結論

選擇直接嵌入結構或使用指標取決於預期的用例。嵌入結構提供了直接存取嵌入欄位的便利,而嵌入指標允許對嵌入結構進行修改以影響多個副本。了解這些含義可確保正確使用並避免程式碼中潛在的陷阱。

以上是在 Go 中嵌入結構體或指向結構體的指標:何時應該選擇什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板