gpt4 book ai didi

go - 实现一个通用的参数方法

转载 作者:行者123 更新时间:2023-12-01 22:16:23 24 4
gpt4 key购买 nike

我在 Go 中有代码,其中包括许多执行方法。
每个方法都接收它自己的参数结构。
我希望调度程序使用其相关结构调用每个方法。

调度程序接收执行方法的名称,以及参数结构的 JSON。
然后,它使用反射来构建结构,并调用方法。

问题是我得到编译错误,除非我使用空接口(interface)创建执行方法。
在下面的示例中,我有 2 个执行方法: api1 正在编译,但使用的是空接口(interface)和显式转换。 api2 是我想要做的,但它因编译错误而失败:

cannot use api2 (type func(Api2Parameters)) as type Api in assignment



如何使 api2 使用编译?

import (
"encoding/json"
"log"
"reflect"
)

type Api func(arguments interface{})

type ApiDetails struct {
Executor *Api
ParametersType reflect.Type
}

var Apis map[string]*ApiDetails

func RunApi(apiName string, data string) {
api := Apis[apiName]
parameters := reflect.New(api.ParametersType).Interface().(interface{})
_ = json.Unmarshal([]byte(data), parameters)
(*api.Executor)(parameters)
}

type Api1Parameters struct {
Count1 int
Id1 string
}

func api1(arguments interface{}) {
parameters, _ := arguments.(*Api1Parameters)
log.Printf("api1 parameters(%+v)", parameters)
}

type Api2Parameters struct {
Count2 int
Id2 string
}

func api2(arguments Api2Parameters) {
log.Printf("api2 parameters(%+v)", arguments)
}

func Test() {
// this assignment works fine
var api_1 Api = api1
Apis["api1"] = &ApiDetails{
Executor: &api_1,
ParametersType: reflect.TypeOf(Api1Parameters{}),
}

// this assignment produce compile error
var api_2 Api = api2
Apis["api2"] = &ApiDetails{
Executor: &api_2,
ParametersType: reflect.TypeOf(Api2Parameters{}),
}

RunApi("api1", `{"Count1":19, "Id1":"a"}`)
RunApi("api2", `{"Count2":34, "Id2":"b"}`)
}

最佳答案

使用参数类型创建一个值,解码该值并调用该函数:

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()})
}

Run it on the playground .

关于go - 实现一个通用的参数方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59807355/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com