假设我们有这段代码:
type User struct {
int32
Name string
}
这种类型的嵌入是否有用?
int32
是否有其他方法可以调用User
实例的方法?
如何访问int32
嵌入的User
的值?
答案 0 :(得分:8)
类型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
使用嵌入的主要好处是:
嵌入式类型的方法得到提升,因此更容易实现接口(您不需要提供升级的方法)
你可以"覆盖"嵌入式类型的方法(在嵌入器类型上):提供您自己的实现,当使用嵌入器类型的值时将调用该实现
并且嵌入类型的字段会被提升,因此代码缩短以引用提升的字段(字段名称被省略)。
通过嵌入预先声明的类型(例如int32
),您不会仅使用常规字段(名为,而不是嵌入字段)作为{{1 }}类型没有任何方法或字段。
展望未来,除了没有任何优势之外,你甚至还有一个劣势。由于预先声明的类型名称以小写字母开头,因此隐式嵌入它们会使它们未导出,因此您只能在嵌入类型的声明包中引用它们。如果您将它们设为常规命名字段,则可以选择使用大写的名称将其导出,或者使用小写的名称使其未导出。