2 回答
TA贡献1946条经验 获得超4个赞
使用参数类型创建一个值,解组该值并调用该函数:
var Apis = map[string]interface{}{
"api1": api1,
"api2": api2,
}
func RunApi(apiName string, data string) {
fv := reflect.ValueOf(Apis[apiName])
ft := fv.Type()
pin := reflect.New(ft.In(0))
_ = json.Unmarshal([]byte(data), pin.Interface())
fv.Call([]reflect.Value{pin.Elem()})
}
TA贡献1830条经验 获得超3个赞
如果您想保持这种类型安全,可以将 JSON-to-args 转换推得更深一些:
type Api func(string)
type ApiDetails struct {
// Don't use *Api, that's a function pointer-pointer
Executor Api
}
然后,使用闭包进行 JSON 转换:
Apis["api1"] = &ApiDetails{
Executor: func(data string) {
var args ArgsForAPI1
json.Unmarshal([]byte(string),&args)
api1Implem(args)
}
}
有了这个,你可以这样做:
APIs["api1"].Executor( `{"Count1":19, "Id1":"a"}`)
你可以改变RunApi做这样的事情。
第二种选择是使用反射来做到这一点:
type ApiDetails struct {
// Executor can accept any function signature
// Assume a function with a single parameter
Executor interface{}
ParametersType reflect.Type
}
然后,RunApi 函数可以使用反射构造一个结构并调用Executor:
parameters := reflect.New(api.ParametersType)
_ = json.Unmarshal([]byte(data), parameters.Interface{})
reflect.ValueOf(api.Executor).Call([]reflect.Value{parameters})
这应该可以,但是如果你搞砸了,你只会得到运行时错误。
- 2 回答
- 0 关注
- 133 浏览
添加回答
举报