Go:嵌入原始类型?

Go: Embedding a primitive type?

假设我们有这段代码:

type User struct {
    int32
    Name string
}

这种类型的嵌入有用吗?
int32 是否有其他方法可以调用 User 的实例?
如何访问 User 嵌入的 int32 的值?

类型 int32predeclared type,它没有方法。验证:

fmt.Println(reflect.TypeOf(int32(0)).NumMethod()) // Prints 0

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

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

输出(在 Go Playground 上尝试):

main.User{int32:3, Name:"Bob"}
4

使用嵌入的主要好处是:

  • 内嵌类型的方法得到提升,实现接口更容易(不需要提供提升的方法)

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

  • 嵌入类型的字段得到提升,因此引用提升字段的代码更短(字段名称被省略)。

通过嵌入预先声明的类型,例如 int32,与仅使用常规字段(named,而不是嵌入字段)相比,您没有任何优势,因为int32 类型没有任何方法或字段。

往前看,你除了没有优势,还有劣势。由于预先声明的类型名称以小写字母开头,隐式嵌入它们会使它们 unexported,因此您只能在嵌入器类型的声明包中引用它们。如果您将它们设为常规 命名 字段,您可以选择使用大写名称使其导出,或使用小写名称使其不导出。