package main 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 个,缺少接口本身
通过第三种方案反射出来的方法,结果符合预期,但是需要每个方法都硬编码。
1 Qjues OP 有没有什么其他的方案呢,通过接口可以分析出每个方法的完整类型。 |
![]() | 2 mightybruce 2023-10-16 15:01:53 +08:00 |
![]() | 3 mcfog 2023-10-16 19:20:09 +08:00 m1,m2: https://pkg.go.dev/reflect#Type.MethodByName m3: https://go.dev/ref/spec#Method_expressions 这些行为都是符合预期的,如果你不要 receiver 可以自己移除,如果你要 receiver 可以自己补充,哪种都可以 |
5 Qjues OP @mightybruce ok ,我研究研究 |
6 CodeCodeStudy 2023-10-17 09:05:51 +08:00 自定义的类型名称能不能不和关键字重复,看着难受 |
![]() | 7 rickiey 2023-10-17 09:39:42 +08:00 |
8 Qjues OP @CodeCodeStudy ---我只是想体现出这是一个 interface |