当使用结构类型作为指针时(即,使用指针接收器,构造函数返回 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