import (
"fmt"
"reflect"
)
type Interface interface {
Interface(arg int) string
}
type Struct struct {
}
func (s Struct) Interface(arg int) string {
//TODO implement me
panic("implement me")
}
func main() {
of := reflect.TypeOf(Struct{})
m1, _ := of.MethodByName("Interface")
fmt.Println(m1.Type.NumIn()) // output 2 -> in[0] is Struct
fmt.Println(m1.Type.In(0))
m2, _ := reflect.TypeOf((*Interface)(nil)).Elem().MethodByName("Interface")
fmt.Println(m2.Type.NumIn()) // output 1 -> in[0] is int
fmt.Println(m2.Type.In(0))
m3 := reflect.ValueOf(Interface.Interface)
fmt.Println(m3.Type().NumIn()) // output 2 -> in[0] is Interface
fmt.Println(m3.Type().In(0))
}
想实现接口方法的分析,每个方法的入参第一个应该是接口本身。
通过第一种方案反射出来的方法,入参有 2 个,但是第一个参数是结构体,和接口无关了
通过第二种方案反射出来的方法,入参只有 1 个,缺少接口本身
通过第三种方案反射出来的方法,结果符合预期,但是需要每个方法都硬编码。