面向对象编程离不开封装、继承、多态三个特性,go语言与其他c++、java不太一样,没有类的概念,面向对象的实现也有些区别,下面分别描述。
在go语言中,如果一个结构体中嵌套了另一个匿名结构体对象,那么这个结构体可以直接访问这个匿名结构体的字段和方法(无论大小写),从而实现继承的特性。
例:
type Goods {
Name string
Price int
}
type Book struct {
// 这里直接包含Goods结构体,那么Book的对象可直接访问Name和Price字段
Goods
Writer string
}
在使用时,我们可以显式地调用Goods从而调用Goods相关的字段或方法,也可以直接隐式地调用,省略Goods:
mathbook := Book{}
mathbook.Goods.Name = "math"
mathbook.Goods.SetPrice(15) // 假设SetPrice是Goods绑定的方法
mathbook.Price = 20 // 这里可省略Goods
mathbook.Writer = "lzs"
当我们省略写法调用基类型的字段或方法时,编译器首先在当前类型中找有没有对应的字段或方法,有就调用,没有就看其嵌套的结构体有没有。若都找不到,则报错。若有多层嵌套,则会依次往上找。
必须显式地调用匿名结构体的场景:
在创建结构体变量时,也可以同时指定结构体的字段值,写法如下:
// 写法有顺序要求
mathbook := Book{Goods{"math", 15}}
// 或以下写法,无顺序要求
mathbook := Book{
Name : "math",
Price : 15,
}
有多个匿名结构体依次写即可。
一些实际使用的细节:
type computer struct {
*Goods
}
type computer struct {
*Goods
int
}
func main() {
huashuo := computer{}
huashuo.int = 3000
}
匿名数据类型在同一个结构体中,只能有一个
由于多态涉及到接口的概念,我们在下一个篇章来讲解