英文源地址
Go支持嵌入结构体和接口, 以表达更无缝的类型组合. 不要与//go:embed混淆, 后者是在Go1.16+版本中引入的一个go指令,用于将文件和文件夹嵌入到应用程序二进制文件中的.
package main
import "fmt"
type base struct {
num int
}
func (b base) describe() string {
return fmt.Sprintf("base with num=%v", b.num)
}
// container中嵌入了base.一个结构嵌入看起来像是一个没有名字的字段
type container struct {
base
str string
}
func main() {
// 当创建具有字面量的结构体时, 我们必须显式地初始化嵌入, 在这里, 嵌入类型用作字段名
co := container{
base: base{
num: 1,
},
str: "some name",
}
// 我们可以直接在co上直接访问base地字段, 比如使用co.num
fmt.Printf("co={num: %v, str: %v}\n", co.num, co.str)
// 或者, 我们可以使用嵌入的类型名称来拼写完整的路径
fmt.Println("also num: ", co.base.num)
// 由于container中嵌入了base, base的方法也就成为了container的方法.
// 在这里, 我们直接通过co调用嵌入的base中的方法
fmt.Println("describe:", co.describe())
type describer interface {
describe() string
}
// 用方法嵌入结构可以用来将接口实现赋予其他结构.
// 这里我们看到container现在实现了describer接口, 因为它嵌入了base
var d describer = co
fmt.Println("describer:", d.describe())
}
$ go run struct-embedding.go
co={num: 1, str: some name}
also num: 1
describe: base with num=1
describer: base with num=1
下一节介绍: 泛型Generics.