标签:结构 targe style 模式 大写 另一个 ref round ring
在 golang 中,如果一个结构体嵌套了另一个匿名结构体,那么这个结构体可以直接访问匿名结构体的字段和方法,从而实现了继承。
type Animal struct { Name string Age int } type TaiDi struct { Animal // 这就是嵌套匿名结构体Animal } func (a *Animal) Eat() { fmt.Printf("%s今年%d岁,它正在吃东西...", a.Name, a.Age) } func main() { var td TaiDi td.Animal.Name = "泰迪" td.Animal.Age = 1 // 可以简化成 // td.Name = "泰迪" // td.Age = 1 td.Eat() }
如果结构体和匿名结构体有相同的字段或者方法时,编译器采用就近原则访问,如果希望访问匿名结构体的字段或方法,可以通过匿名结构体来区分。
type B struct { Name string } type C struct { Name string A B } func (a *A) Eat() { fmt.Printf("%s正在吃饭...\n", a.Name) // AA正在吃饭... } func (b *B) Eat() { fmt.Printf("%s正在吃饭...\n", b.Name) // 正在吃饭... } func main() { var c C c.Name = "CC" c.A.Name = "AA" c.A.Eat() c.B.Eat() }
如果一个结构体嵌套了一个有名结构体,这种模式就是组合,如果是组合关系,那么在访问组合的结构体的字段或方法时,必须带上这个结构体的名字。
type A struct { Name string } type B struct { a A } func (a *A) Eat() { fmt.Printf("%s正在吃饭...\n", a.Name) // 佩奇正在吃饭... } func main() { var b B // b.Name = "佩奇" ,会报错,必须指定有名结构体的名字,如下 b.a.Name = "佩奇" b.a.Eat() }
在学习多态之前,先学习接口。
标签:结构 targe style 模式 大写 另一个 ref round ring
原文地址:https://www.cnblogs.com/believepd/p/10940212.html