go - 用go编写更简洁的代码

标签 go

我正在编写一个包,其中包含从 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/

相关文章:

go - 除非变量被复制,否则 go 例程中的闭包具有不正确的范围

exception - 引发异常

go - 如何用两个手动调用替换简单的两匝回路(棘手)

function - 从函数返回函数以及为什么省略括号?

goroutine 睡着了 - 死锁

algorithm - 读取和写入同一 channel 的工作池去

http - beego POST 请求体始终为空

for-loop - 使用 for 循环打印给定的字符模式?

compiler-construction - 在 Windows 中编译 Go 文件?

git - 使用 Git(或任何 VCS)的 Go 项目的正确组织是什么?