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}}
⑦:多重继承,在第④中有举例,略。