Go:嵌入原始类型?

时间:2016-08-07 05:40:43

标签: go struct embedding

假设我们有这段代码:

type User struct {
    int32
    Name string
}

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

1 个答案:

答案 0 :(得分:8)

类型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

使用嵌入的主要好处是:

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

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

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

通过嵌入预先声明的类型(例如int32),您不会仅使用常规字段(名为,而不是嵌入字段)作为{{1 }}类型没有任何方法或字段。

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