如果我有一个A用作指针的结构类型(仅具有指针接收器,构造函数返回等),那么嵌入结构类型与嵌入结构类型*A有什么区别?BB*B
也就是说,有什么区别
type B struct {...}
type A struct {
B
// ...
}
Run Code Online (Sandbox Code Playgroud)
和
type B struct {...}
type A struct {
*B
// ...
}
Run Code Online (Sandbox Code Playgroud)
例如,是否存在嵌入字段的复制?
编辑:我还应该提到嵌入式结构B只有指针接收器。
两种结构的零值不同,这可能是一个显着的人体工程学差异。
考虑嵌入类型
type B struct {
X int
}
func (b *B) Print() { fmt.Printf("%d\n", b.X) }
Run Code Online (Sandbox Code Playgroud)
如果我们直接将其嵌入为对象
type AObj struct {
B
}
Run Code Online (Sandbox Code Playgroud)
那么 type 的零值AObj包括类型 的嵌入对象B,该对象也有其零值,因此我们可以安全地
var aObj AObj
aObj.Print() // prints 0
Run Code Online (Sandbox Code Playgroud)
但如果我们嵌入一个指针
type APtr struct {
*B
}
Run Code Online (Sandbox Code Playgroud)
这个结构体的零值有一个 nil 指针值,我们不能真正直接使用它。
var aPtr APtr
aPtr.Print() // panics
Run Code Online (Sandbox Code Playgroud)
对象有望以您期望的方式被复制。如果您创建一个新AObj对象,它将获得嵌入的B.
aObj2 := aObj
aObj.X = 1
aObj2.Print() // prints 0, because it has a copy
Run Code Online (Sandbox Code Playgroud)
如果创建一个新APtr对象,它会获得 的副本*B,这意味着它共享底层的具体对象。
aPtr.B = &B{}
aPtr2 := aPtr
aPtr.X = 1
aPtr2.Print() // prints 1, because both objects point at the same B
Run Code Online (Sandbox Code Playgroud)
可运行示例位于https://play.golang.org/p/XmOgegwVFeE
| 归档时间: |
|
| 查看次数: |
1236 次 |
| 最近记录: |