go语言里没有类的概念,不过有结构体这样的语法,也可以当做类来使用,并在结构体中定义方法,最终达到c++语言中派生和继承的效果。
具体是在结构体里内嵌其他结构体,当做从基类派生一样,可以继承使用基类的方法。比如:
type Books struct {//定义一个基类结构体Books
title string
id int
}
func (bk Books) m_Get () (string,int) {//这里是获取结构体变量的成员值,返回多个值。因为是只读取操作,所以传递值即可。
return bk.title,bk.id
}
type EngBooks struct {//定义一个派生类结构体
Books //内嵌一个结构体,相当于是从基类Books派生出子类
grad int
}
func main() {
bk1:=Books{"haha",1}//第一种初始化方法,是通过列表形式依次赋值每个成员
bk2:=Books{title:"haha"}//第二种初始化方法,是通过成员名:具体值形式,这种可以只定义其中某个值,不用全部定义。
bk3:=Books{}//第三种方法,直接一个大括号{},表示创建一个空结构体对象,所有成员都是默认值。
var bk4 Books//第四种初始化方法,是先声明一个结构体成员,
bk4.title="haha"//然后再通过.成员名依次初始化
bk5:=new(Books)//第五种方法,直接用new创建一个结构体指针,new函数参数里只需传递类型名即可
//对应的派生类结构体初始化,也是可以上边五种方法,只是因为内嵌有基类,所以稍微有点变化
//egbk:=EngBooks{Books{"haha",1},2} //对应上边基类的第一种初始化方法
egbk:=EngBooks{Books:Books{id:10}}//对应上边第二种,冒号:左边的Books是派生类的成员名,右边的Books{id:10}就是具体的值,定义形式参考上边基类的前三种初始化方法
//后面三种初始化方法跟上边基类的一样,这里不再赘述。
//因为派生类里内嵌有基类,所以可以直接调用基类的方法。
tstr,tid:=egbk.m_Get()
fmt.Printf("调用基类的方法m_Get:%s-%d\n",tstr,tid)
}