在用作指针的结构中嵌入结构与指向结构的指针

Rob*_*rtR 4 struct go

如果我有一个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只有指针接收器。

Dav*_*aze 6

两种结构的零值不同,这可能是一个显着的人体工程学差异。

考虑嵌入类型

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