gpt4 book ai didi

go - 在 go 中编写更简洁的代码

转载 作者:IT王子 更新时间:2023-10-29 01:43:20 25 4
gpt4 key购买 nike

我正在编写一个包,其中包含从 XML-RPC 服务器读取数据并将其存储在 go 结构数组中的函数。这是两种结构的片段:http://play.golang.org/p/a1dVA0UCzS .对于每种类型的结构,我都有一个单独的“转换”功能。总共有 20 多个 - 只是彼此的普通副本,只是替换了结构名称。

是否有一个优雅的解决方案,而不是愚蠢地复制/粘贴相同的代码?

最佳答案

您可以使用反射来做到这一点。查看pkg/reflect文档。

对于您的情况,reflect.MakeFunc 很有趣。您可以使用反射创建函数然后发送消息并知道他们将收到的类型。用法示例:

var getFooRequest func() []Foo                      // Prototype of request.
buildRequest("FooStore.GetFoo", &getFooRequest) // Build request function.

result := getFooRequest() // Actually sending.

一个工作示例(play):

func makeRequestFunc(req string, fptr interface{}) {
baseRequestFunc := func(params []reflect.Value) []reflect.Value {
log.Println("Sending", req)
return []reflect.Value{ reflect.ValueOf([]int{1,2,3,4}) }
}

fn := reflect.ValueOf(fptr).Elem()
reqFun := reflect.MakeFunc(fn.Type(), baseRequestFunc)
fn.Set(reqFun)
}

var fooRequest func() []int

makeRequestFunc("foo", &fooRequest)

log.Println( fooRequest() )
本例中的

baseRequestFunc 是您调用 store.client.Call 的地方用你喜欢的任何字符串。从这个基本函数中,您可以创建一个新函数,它是可使用 reflect.MakeFunc 调用并将结果存储在传递的函数指针中。

由于fooRequest有明确的签名,不需要解包。

关于go - 在 go 中编写更简洁的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19597601/

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