上一篇只是动态调用方法,这次我们得用反射动态获取方法和每个方法的参数.代码举例如下:
package main import ( "fmt" "reflect" "strconv" ) type MyMath struct{ a int } func (mm *MyMath) Add(num1 float64,num2 float64 ) float64 { reply := num1+num2 return reply } func (mm *MyMath) Sub(num1 float64,num2 float64 ) float64 { reply := num1-num2 return reply } func main() { m := new(MyMath) typ := reflect.TypeOf(m) //遍历方法 for i := 0; i < typ.NumMethod(); i++ { method := typ.Method(i) mname := method.Name//方法名字 fmt.Println("method:"+mname) fun := reflect.ValueOf(m).MethodByName(mname) ty := method.Type args := make([]reflect.Value, ty.NumIn()-1) //遍历参数 for j:= 1; j< ty.NumIn(); j++ { //参数类型 arg_type := ty.In(j).Kind().String() fmt.Println("参数" + strconv.Itoa(j) + ":" + arg_type) switch arg_type { case "float64": args[j-1] = reflect.ValueOf(float64(j)) default: fmt.Println("i down'n knowon type " + arg_type) } } ret := fun.Call(args) fmt.Println(ret[0]) } }
这样,我们以后就可以知道一个类下有多少个方法,每个方法下有多少个参数且类型是什么,方便我们与其他弱语言相互调用的时候来处理类型!