1. func Call(m map[string]interface{}, name string, params ...interface{}) ([]reflect.Value, error) {

  2. f := reflect.ValueOf(m[name])

  3. if len(params) != f.Type().NumIn() {

  4. return nil, errors.New("the number of input params not match!")

  5. }

  6. in := make([]reflect.Value, len(params))

  7. for k, v := range params {

  8. in[k] = reflect.ValueOf(v)

  9. }

  10. return f.Call(in), nil

  11. }

使用:

  1. func Test(a, b string) (string,error) {

  2. return a +" "+ b,nil

  3. }

  1. m := map[string]interface{}{"test":Test}

  2. ret, err := Call(m, "test", "hello", "world")

  3. log.Fatalln("method invoke error:", err)

  4. }

  5. fmt.Println(ret)

本文来自:博客园

查看原文:golang通过反射动态调用方法返回搜狐,查看更多