具体来说,可以定义一个基类(例如 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("汪汪汪!")
}
接下来有两种方法来实现狗类的行为:
- 重写基类方法Say:
func (d *Dog) SayName(name string) {
fmt.Printf("%s: ", name)
d.Say()
}
func main() {
dog := NewDog()
dog.SayName("可乐")
}
- 通过实现接口方式:
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语言中没有传统意义上的继承,但是通过组合、嵌入和接口可以实现类似继承的功能,并且更加灵活、易于维护。