Если вы хотите сохранить этот тип в безопасности, вы можете немного глубже сделать sh преобразование JSON в арги:
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})
Это должно работать, но вы вы получите только ошибки времени выполнения, если вы все испортите.