Go:嵌入原始类型?

mah*_*dix 3 struct embedding go

假设我们有这段代码:

type User struct {
    int32
    Name string
}
Run Code Online (Sandbox Code Playgroud)

这种类型的嵌入是否有用?
int32没有其他方法可以调用实例的方法User
我如何才能获得的价值int32User被嵌入?

icz*_*cza 8

类型int32预先声明的类型,它没有方法.核实:

fmt.Println(reflect.TypeOf(int32(0)).NumMethod()) // Prints 0
Run Code Online (Sandbox Code Playgroud)

您可以使用非限定类型名称作为字段名称(Spec:Struct types)来引用所有嵌入字段,预先声明的类型也不例外.看这个例子:

u := User{3, "Bob"}
fmt.Printf("%#v\n", u)
u.int32 = 4
fmt.Println(u.int32)
Run Code Online (Sandbox Code Playgroud)

输出(在Go Playground上试试):

main.User{int32:3, Name:"Bob"}
4
Run Code Online (Sandbox Code Playgroud)

使用嵌入的主要好处是:

  • 嵌入式类型的方法得到提升,因此实现接口更容易(您不需要提供被提升的方法)

  • 你可以"覆盖"嵌入式类型的方法(在嵌入器类型上):提供你自己的实现,当你使用embedder类型的值时将调用它

  • 并且嵌入类型的字段被提升,因此代码更短以引用提升的字段(字段名称被省略).

通过嵌入预先声明的类型,例如int32,使用常规字段(命名,而不是嵌入字段)没有任何优势,因为该int32类型没有任何方法或字段.

展望未来,除了没有任何优势之外,你甚至还有一个劣势.由于预先声明的类型名称以小写字母开头,因此隐式嵌入它们会使它们不被导出,因此您只能在嵌入类型的声明包中引用它们.如果您将它们设为常规命名字段,则可以选择使用大写的名称将其导出,或者使用小写的名称使其未导出.