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 个,缺少接口本身
通过第三种方案反射出来的方法,结果符合预期,但是需要每个方法都硬编码。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.