【Golang中的"继承"】go语言是没有继承的,但结构体支持匿名字段,可以利用这个来实现“继承”。
类Human
。有2个字段:name
,sex
。有2个方法:walk
,eat
。
类SuperMan
。有3个字段:Human
,name
,level
。有2个方法:eat
,fly
。
这是标准说法,但你可以这么理解:SuperMan
继承了Human
,当然同样继承了所有字段和所有方法。同时又加入了自己的两个字段,其中有一个字段和父类是同名的,另外重写了父类中的一个方法,也添加了自己的一个方法。
代码如下:
package main import(
"fmt"
)type Human struct{
name string
sex string
}func (h Human) Eat(){
fmt.Println("Human.Eat:",h)
}func (h Human) Walk(){
fmt.Println("Human.Walk:",h)
}type SuperMan struct{
Human
name string
level int
}func (s SuperMan) Eat(){
fmt.Println("SuperMan.Eat:",s)
}func (s SuperMan) Fly(){
fmt.Println("I believe I can fly!",s)
}func test(h Human){
fmt.Println("test pass!")
}func main() {
h:=Human{"zzp","man"}
h.Eat()//调用自己的方法
h.Walk()//调用自己的方法s:=SuperMan{Human{"sm","no"},"myname",99}fmt.Println(s.name)//myname
fmt.Println(s.Human.name)//sm
fmt.Println(s.sex)//no
fmt.Println(s.Human.sex)//nos.Walk()//调用父类中的方法
s.Eat()//调用自己重写的父类的方法
s.Human.Eat()//调用父类中被自己重写的方法,这点比java高级
s.Fly()//调用自己的方法test(h)
//test(s)//导致错误,方法需要Human类型,但传的是SuperMan类型
test(s.Human)//正确
}
参考链接:https://blog.csdn.net/qq_26847293/article/details/51085327
推荐阅读
- Go语言之GRPC
- go语言深拷贝和浅拷贝
- 通过golang context实现请求超时控制和goroutine生命周期控制
- go protobuf 使用教程(windows环境下)
- 网络协议与网络编程|Go语言进行web开发(二) Go中的Socket编程
- go的gin框架使用(一)(Hello World)
- golang|Go语言入门——从一个简单例子入门
- go语言之脚本命令的使用
- 2018|Base58编码解码Go实现