在go中编写更简洁的代码

时间:2013-10-25 19:05:13

标签: go

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

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

1 个答案:

答案 0 :(得分:2)

您可以使用反射来完成此操作。请参阅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具有明确的签名,因此无需解包值。