概述
在Go语言中,如果我们声明了一个没有名称的字段,这叫做嵌入字段。
嵌入字段用于提升嵌入类型的字段和方法,如下:
type Event struct {
ID int
time.Time ①
}
① 嵌入的字段
time.Time是一个嵌入字段,因为它没有名称声明。如果我们创建一个Event结构体类型,我们可以在Event结构体层直接访问time.Time的方法。
event := Event{}
second := event.Second() ①
① 如果结构体中没有嵌入time.Time类型,例如我们在上面的结构体中指定的是一个t变量名的字段,我们要访问Second方法时需要使用下面的方法:event.t.Second()
该Second方法被提升为可通过Event结构直接访问的方法。这就是为什么嵌入式字段主要用于结构体或接口中,而不是像int或string之类的基本类型。
案例
使用JSON的marshaling方法封装嵌入字段会有什么影响呢?我们将实例化一个Event示例并把他marshal成JSON格式。下面的这段代码将输出什么呢?
event := Event{
ID: 1234,
Time: time.Now(), ①
}
b, err := json.Marshal(event)
if err != nil {
return err
}
fmt.Printf("json: %s\n", string