Golang的继承与java和php不太一样,如php继承需要用到extends关键字,而Golang使用的是匿名继承或有名继承。
二:简单举例
1package main 2 3import ( 4 "fmt" 5) 6type Brand struct{ 7 Name string 8 9} 10 11type Goods struct{ 12 Brand 13 Goods_name string 14} 15 16func main() { 17 var extends Goods 18 extends.Brand.Name = "伊利" 19 extends.Goods_name= "纯牛奶" 20 fmt.Println(extends) 21} 22结果 23[ `go run extends.go` | done ] 24 {{伊利} 纯牛奶}
继承的好处有,提高代码的复用性,程序的扩展和维护更加简单
三:继承的使用细节
①:结构体可以使用继承结构体的所有字段,无论首字母大写还是小写。
1package main 2 3import ( 4 "fmt" 5) 6type Person struct{ 7 Name string 8 age int 9} 10 11func (p Person) say() { 12 fmt.Printf("我的名字叫%v,今年%v岁", p.Name, p.age) 13} 14 15type Anna struct{ 16 Person 17 18} 19 20func main() { 21 var anna Anna 22 anna.Person.Name = "anna" 23 anna.Person.age = 18 24 anna.say() 25} 26结果 27[ `go run extends.go` | done ] 28 我的名字叫anna,今年18岁
②:匿名继承方法访问方式可以简化
修改①中的例子,将访问方式简化
1func main() { 2 var anna Anna 3 anna.Name = "anna" 4 anna.age = 18 5 anna.say() 6}
③:当结构体和匿名结构体有相同字段时,结构体变量采用就近原则来方法字段,如果希望采用匿名的字段,使用详细访问方式即可
1package main 2 3import ( 4 "fmt" 5) 6type Person struct{ 7 Name string 8 age int 9} 10 11func (p Person) Say() { 12 fmt.Printf("我的名字叫%v,今年%v岁", p.Name, p.age) 13} 14 15type Anna struct{ 16 Person 17 age int 18} 19 20func (a Anna) AnnaSay() { 21 fmt.Printf("我今年%v岁", a.age) 22} 23 24func main() { 25 var anna Anna 26 anna.Name = "anna" 27 anna.age = 18 28 anna.Say() 29 fmt.Println() 30 anna.AnnaSay() 31} 32结果 33[ `go run extends.go` | done ] 34 我的名字叫anna,今年0岁 35 我今年18岁
备注:anna访问的流程如下 先查找Anna结构体是否有需要的字段,有就是要Anna结构体,否则往Anna的匿名结构体Person上查找,找到就使用该结构体的字段,否则继续往Person的匿名结构体查找,直到按照就近原则找到为止,没找到就报错。
④:当有两个匿名结构体,且两个匿名结构体有相同的字段名称而结构体如Anna没有该形同字段时,必须指定匿名结构体名称,否则报错。
1package main 2 3import ( 4 // "fmt" 5) 6type Person struct{ 7 Name string 8 age int 9} 10 11type Animal struct{ 12 Name string 13 age int 14} 15 16type Anna struct{ 17 Person 18 Animal 19} 20 21func main() { 22 var anna Anna 23 //错误的写法 24 anna.age = 2 25 //正确的写法 26 anna.Person.age = 3 27 anna.Animal.age = 2 28}
⑤:结构体继承有名结构体时,这种方式就是组合,访问组合的字段时,必须带上结构体名称
1type Anna struct{ 2 p Person 3} 4 5func main() { 6 var anna Anna 7 anna.p.age = 2 8}
在第④基础上修改。
⑥:在创建结构体变量时可以同时指定匿名结构体的字段值
1package main 2 3import ( 4 "fmt" 5) 6type Person struct{ 7 Name string 8 age int 9} 10 11 12type Anna struct{ 13 Person 14} 15 16func main() { 17 var anna Anna = Anna{Person{"anna",18}} 18 fmt.Println(anna) 19 var louis Anna = Anna{Person{ 20 Name : "louis", 21 age :18, 22 },} 23 fmt.Println(louis) 24} 25结果 26[ `go run extends.go` | done ] 27 {{anna 18}} 28 {{louis 18}}
⑦:多重继承,在第④中有举例,略。