Go:嵌入原始类型?
Go: Embedding a primitive type?
假设我们有这段代码:
type User struct {
int32
Name string
}
这种类型的嵌入有用吗?
int32
是否有其他方法可以调用 User
的实例?
如何访问 User
嵌入的 int32
的值?
类型 int32
是 predeclared 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,因此您只能在嵌入器类型的声明包中引用它们。如果您将它们设为常规 命名 字段,您可以选择使用大写名称使其导出,或使用小写名称使其不导出。
假设我们有这段代码:
type User struct {
int32
Name string
}
这种类型的嵌入有用吗?
int32
是否有其他方法可以调用 User
的实例?
如何访问 User
嵌入的 int32
的值?
类型 int32
是 predeclared 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,因此您只能在嵌入器类型的声明包中引用它们。如果您将它们设为常规 命名 字段,您可以选择使用大写名称使其导出,或使用小写名称使其不导出。