當使用結構類型作為指針時(即,使用指針接收器,構造函數傳回A 等),嵌入結構體(如B)或其指標(如B)之間的選擇具有微妙但重要的後果。
零值
兩個選項的零值差異很大。嵌入B 直接創建一個具有零值的嵌入對象,這允許對其進行立即操作:
<code class="go">type AObj struct { B } var aObj AObj aObj.Print() // Prints 0 (B's zero value)</code>
相反,嵌入*B 會產生帶有nil 指針的零值,從而阻止直接使用:
<code class="go">type APtr struct { *B } var aPtr APtr aPtr.Print() // Panics (nil pointer dereference)</code>
複製
物件複製行為取決於嵌入類型。當B 作為物件嵌入時,複製時會建立一個新物件:
<code class="go">type AObj struct { B } aObj2 := aObj aObj.X = 1 aObj2.Print() // Prints 0 (copy of B's zero value)</code>
相反,使用指標嵌入(*B),原始物件和複製物件共享相同的基礎B 對象,從而允許同步更改:
<code class="go">type APtr struct { *B } aPtr.B = &B{} aPtr2 := aPtr aPtr.X = 1 aPtr2.Print() // Prints 1 (shared underlying B)</code>
這些差異對於程式碼可讀性、可維護性和效能最佳化具有實際影響。透過了解結構嵌入與指標嵌入的細微差別,開發人員可以主動避免潛在的陷阱,並針對其特定用例利用最合適的方法。
以上是嵌入式結構與結構指標:零值和複製有什麼關係?的詳細內容。更多資訊請關注PHP中文網其他相關文章!