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