继承是面向对象的一个重要特性之一,但是针对go语言来说,并不支持严格意义上的继承方法,以下使用PHP和go进行对比
PHP实现继承
<?php
class Pet
{
public function speak()
{
echo "....\n";
}
public function speakTo(string $name)
{
$this->speak();
echo $name;
}
}
class Dog extends Pet
{
public function speak()
{
echo "Wang!\n";
}
}
function main()
{
$dog = new Dog();
$dog->speak();
$dog->speakTo("肥龙");
}
main();
此时,运行PHP代码,会输出
Wang!
Wang!
肥龙
因为Dog继承了Pet的方法speakTo和重写了speak方法
go实现”继承“
package main
import (
"fmt"
)
type Pet struct {
}
func (p *Pet) Speak() {
fmt.Println("...")
}
func (p *Pet) SpeakTo(name string) {
p.Speak()
fmt.Println(name)
}
type Dog struct {
Pet
}
func (d *Dog) Speak() {
fmt.Println("Wang!")
}
func main() {
d := new(Dog)
d.Speak()
d.SpeakTo("肥龙")
}
输出结果
Wang!
...
肥龙
可以看出,Dog貌似是”继承“了Speak的方法,但是实际上在执行SpeakTo的时候,最终执行的还是Pet里面的SpeakTo的逻辑,所以Go其实并不支持面向对象的继承,而只是”伪继承“