Go语言中没有类(class)的概念,也没有传统意义上的继承(inheritance)

发布时间 2023-04-18 01:49:15作者: est7

具体来说,可以定义一个基类(例如 struct),然后通过嵌入(embedding)基类的方式在子类中实现继承。同时,可以使用接口来定义类的行为。

举个例子,假设需要定义一个动物(Animal)作为基类,其中有一个Say方法表示动物的叫声:

type Animal struct {
NumLegs int
}

func (a *Animal) Say() {
fmt.Println("...")
}

然后我们可以定义一个狗类(Dog),并通过Animal的嵌入来实现继承:

type Dog struct {
*Animal
}

func NewDog() *Dog {
return &Dog{
Animal: &Animal{
NumLegs: 4,
},
}
}

func (d *Dog) Say() {
fmt.Println("汪汪汪!")
}

接下来有两种方法来实现狗类的行为:

  1. 重写基类方法Say:

func (d *Dog) SayName(name string) {
fmt.Printf("%s: ", name)
d.Say()
}

func main() {
dog := NewDog()
dog.SayName("可乐")
}

  1. 通过实现接口方式:

type ISayName interface {
SayName(name string)
}

func (d *Dog) SayName(name string) {
fmt.Printf("%s: ", name)
d.Say()
}

func main() {
var dog ISayName = NewDog()
dog.SayName("可乐")
}

这里我们定义了一个 ISayName 接口,并在 Dog 类中实现 SayName 方法。然后我们通过实现接口来实现狗类的行为。

虽然Go语言中没有传统意义上的继承,但是通过组合、嵌入和接口可以实现类似继承的功能,并且更加灵活、易于维护。