场景是回调N多函数或方法,且不知道具体的函数和参数,只有回调指针和无类型参数列表。
reflect_func.go:
package main
import (
"fmt"
"reflect"
)
func fn(p1, p2, p3 int) int {
return p1 + p2 + p3
}
func main() {
typeFunc := reflect.TypeOf(fn)
argInNum := typeFunc.NumIn()
paramList := []reflect.Value{}
for i := 0; i < argInNum; i++ {
argTyp := typeFunc.In(i)
fmt.Printf("param %d type is %s\n", i, argTyp)
paramList = append(paramList, reflect.ValueOf(interface{}(i)))
}
valueFunc := reflect.ValueOf(fn)
resultList := valueFunc.Call(paramList)
argOutNum := typeFunc.NumOut()
for i := 0; i < argOutNum; i++ {
argTyp := typeFunc.Out(i)
fmt.Printf("return %d type is %s\n", i, argTyp)
fmt.Printf("return %d kind is %+v\n", i, resultList[0].Kind())
fmt.Printf("return %d value is %+v\n", i, resultList[0])
}
}
reflect_method.go:
package main
import (
"fmt"
"reflect"
)
type User struct {
Name string
}
func (this *User) Mod(p1, p2, p3 int) int {
return p1 + p2 + p3
}
func main() {
u := &User{"Hank"}
valueM := reflect.ValueOf(u)
method := valueM.MethodByName("Mod")
typeM := reflect.TypeOf(u)
methodType, ok := typeM.MethodByName("Mod")
if !ok {
fmt.Printf("mothod %s not found", "Mod")
return
}
typeFunc := methodType.Type
argInNum := typeFunc.NumIn()
paramList := []reflect.Value{}
//注意从1开始,因为0为self指针
for i := 1; i < argInNum; i++ {
argTyp := typeFunc.In(i)
fmt.Printf("param %d type is %s\n", i, argTyp)
paramList = append(paramList, reflect.ValueOf(interface{}(i)))
}
resultList := method.Call(paramList)
argOutNum := typeFunc.NumOut()
for i := 0; i < argOutNum; i++ {
argTyp := typeFunc.Out(i)
fmt.Printf("return %d type is %s\n", i, argTyp)
fmt.Printf("return %d kind is %+v\n", i, resultList[0].Kind())
fmt.Printf("return %d value is %+v\n", i, resultList[0])
}
}
--end--