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

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

Patricia Arquette
Patricia Arquette原創
2024-10-30 06:06:03513瀏覽

 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中文網其他相關文章!

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