當使用結構類型作為指標時(即,使用指標接收器,構造函數傳回A 等),嵌入結構體(如B)或其指標(如B)之間的選擇微妙但重要結果。
零值
兩個選項的零值差異很大。 Embeddings B 直接建立一個值為零的嵌入對象,這樣就可以對其進行立即操作:
type AObj struct { B }
var aObj AObj
aObj.Print() // Prints 0 (B's zero value)
相反,嵌入*B 會導致帶有nil 指標的零值,從而阻止直接使用:
type APtr struct { *B }
var aPtr APtr
aPtr.Print() // Panics (nil pointer dereference)
複製
物件複製行為取決於嵌入類型。當 B 作為物件嵌入時,複製時會建立一個新物件:
type AObj struct { B }
aObj2 := aObj
aObj.X = 1
aObj2.Print() // Prints 0 (copy of B's zero value)
相反,透過指針嵌入(*B),原始對象和複製對象共享相同的基礎B 對象,從而允許同步更改:
type APtr struct { *B }
aPtr.B = &B{}
aPtr2 := aPtr
aPtr.X = 1
aPtr2.Print() // Prints 1 (shared underlying B)
這些差異對於程式碼可讀性、可維護性和效能最佳化具有實際意義。透過了解結構嵌入與指標嵌入的細微差別,開發人員可以主動避免潛在的陷阱,並針對其特定用例利用最合適的方法。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3