package polymorphism
import (
"fmt"
"testing"
)
type Code string
type Programmer interface {
WriteHelloWorld() Code
}
type GoProgrammer struct {
}
func (g GoProgrammer) WriteHelloWorld() Code {
return "fmt.Println(\"Hello World!\")"
}
type JavaProgrammer struct {
}
func (j JavaProgrammer) WriteHelloWorld() Code {
return "System.out.Println(\"Hello World!\")"
}
func WriteFirstProgrammer(p Programmer) {
fmt.Printf("%T %v\n", p, p.WriteHelloWorld())
}
func TestPolymorphism(t *testing.T) {
goProg := GoProgrammer{}
// goProg := new(GoProgrammer)
javaProg := new(JavaProgrammer)
WriteFirstProgrammer(goProg)
WriteFirstProgrammer(javaProg)
}
老师,为什么我这样写的输出结果没有报错?
输出如下:
=== RUN TestPolymorphism
polymorphism.GoProgrammer fmt.Println("Hello World!")
*polymorphism.JavaProgrammer System.out.Println("Hello World!")
--- PASS: TestPolymorphism (0.00s)
PASS
coverage: 0.0% of statements
ok _/E_/go_learning/src/ch12/polymorphic 0.233s
Done
展开
作者回复: 这是因为在Go Spec中有这样的定义 “The method set of the corresponding pointer type *T is the set of all methods declared with receiver *T or T (that is, it also contains the method set of T).“ 即指针类型可以访问定义在指针类型和值类型上的所有方法。可以参考这篇文章:https://suraj.io/post/golang-methods-interfaces/