Go 中的嵌入结构:指针与对象
处理指针接收者和构造指针类型时,了解嵌入结构之间的区别因为对象 (B) 与指针 (*B) 变得至关重要。在这种情况下,这两个嵌入结构类型的零值显着不同。
直接嵌入(对象)
如果具有指针接收器的结构 B 直接嵌入为结构体 A 中的对象,其零值包括类型 B 的嵌入对象,该对象本身也具有零值。开发人员可以安全地访问此嵌入对象及其方法。
type B struct {
X int
}
func (b *B) Print() { fmt.Printf("%d\n", b.X) }
type AObj struct {
B
}
var aObj AObj
aObj.Print() // prints 0
指针嵌入
相反,嵌入指向 B (*B) 的指针会创建不同的场景。该嵌入结构的零值具有 nil 指针值,使其直接无法使用。
type APtr struct {
*B
}
var aPtr APtr
aPtr.Print() // panics
对象复制
当创建 AObj 对象时,它会获取嵌入的 B 对象的副本。对副本所做的修改不会影响原始对象。
aObj2 := aObj
aObj.X = 1
aObj2.Print() // prints 0
指针复制
使用 APtr,创建一个新对象会复制指针 (*B),但不会复制指向的底层具体对象到。因此,对新对象的修改会影响原始对象和新对象。
aPtr.B = &B{}
aPtr2 := aPtr
aPtr.X = 1
aPtr2.Print() // prints 1
在确定是将结构体嵌入为对象还是指针时,考虑特定用例和要求非常重要。此决定可能会影响零初始化、复制行为和对象所有权等因素。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3