GO语言的结构体没有继承的概念,当需要复用其他结构体的时候,需要使用组合方式将其他结构体嵌入到当前的结构体中。

例如以下代码,结构体类型Animal嵌入类型Cat中:

type Animal struct {
Name string
func (a *Animal) SetName (name string) {
a.Name= name
type Cat struct {
Animal

如果还有一个结构体也尝试组合Animal类型,如下所示:

type Dog struct {
a Animal
}

Cat和Dog有什么区别呢?

结构体中的字段名可以显示的指定也可以隐式的指定。在上面的例子中,Dog结构体中的字段a为显示指定,而Cat结构体由于内嵌了结构体Animal,从而产生了一个隐式的同名字段。

对于类型为结构体的字段,显式指定的时候喝其他的类型没有什么区别,仅仅代表某种类型的字段,而隐式指定的时候,原结构体的字段和方法看起来像是被继承过来一样。

当结构体cat中嵌入另一个结构体Animal时,相当于声明了一个名为Animal的字段,此时结构体Animal中的字段和方法会被提升到cat 中,看上去就像是cat的原生字段和方法。


cat 结构体访问Animal结构体的字段和方法时有两种方式,如下所示。

结论:cat 结构体可以直接访问Animal的字段和方法,也可以通过隐式声明的Animal字段来访问。
 

func EmbeddedFoo() {
C:=Cat{
c.SetName("A")
fmt.Printf("Name : %s\n",c.Name) //A
c.Animal.SetName("a")
fmt.Printf("Name: 号s\n",c.Name)// a
c.Animal.Name = "B"
fmt.Printf("Name: %s\n",c.Name)//B
c.Name = "b"
fmt.Printf("Name: 号s\n", c.Name) //b
}