Go struct 嵌套和组合的区别

7 min read

Go语言的struct可以进行嵌套和组合,但是它们有不同的语义和用法:

  1. 嵌套(Nested Struct)

在一个结构体中,可以嵌套另一个结构体类型的字段,嵌套的结构体称为内部结构体,嵌套的结构体字段称为外部结构体的嵌入字段(Embedded Field)。

嵌套结构体可以理解为一个数据结构中包含另一个数据结构,类似于面向对象中的组合(Composition)。嵌套的结构体可以直接访问内部结构体的字段,也可以实现对其方法的调用。

示例:

type Address struct {
Province string
City string
}

type Person struct {
Name string
Age int
Address Address // 内部结构体
}

person := Person{
Name: "Tom",
Age: 21,
Address: Address{
Province: "Guangdong",
City: "Shenzhen",
},
}

  1. 组合(Composition)

组合是指在一个结构体中直接嵌入另一个结构体类型。组合的结构体需要显式地调用内部结构体的字段或方法来进行访问或操作。

组合可以理解为一种代码复用的方式,类似于面向对象中的继承(Inheritance)。组合在实现接口时比嵌套要灵活,可以按照需要选择组合所需的结构体。

示例:

type Engine struct {
Model string
}

type Car struct {
Brand string
Engine // 直接嵌入 Engine 结构体
}

func main() {
car := Car{
Brand: "Mercedes Benz",
Engine: Engine{
Model: "V12",
},
}

// 访问 Car 结构体中嵌入的 Engine 结构体的 Model 字段
fmt.Println(car.Model)

}

总的来说,嵌套和组合都是用来实现结构体的复用和代码组织,具体选择需要根据实际需求而定。