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
|