2014-03-07 66 views

回答

0

有没有“铸造”是去(好吧,使用“不安全”的包装类似铸造)。

你不能像这样转换函数类型,因为它们在内存中有不同的布局。泛型函数可以通过反射包来完成,但是会带来很大的开销。一个例子见http://golang.org/pkg/reflect/#example_MakeFunc

对于大多数泛型函数的用例,您可能最好接受一个接口,并使用类型断言或开关(http://golang.org/ref/spec#Type_switches),而不是反射库。

1

正如JimB说,你不能去投,你不能转换功能,只是这样的,但通过使用闭包,您可以迅速换你的函数:

func add(a, b int) int { 
    return a + b; 
} 

wrap := func(args ...interface{}) interface{} { 
    return interface{} (add(args[0].(int), args[1].(int))) 
} 

需要注意的是,如果你给纸都会恐慌它不是int类型的参数。如果你想避免这种情况,你可以稍微修改后余音:

wrap := func(args ...interface{}) (interface{}, error) { 
    a, k := args[0].(int) 
    b, l := args[1].(int) 
    if !k || !l { 
     return nil, errors.New("Arguments must be of type int") 
    } 
    return add(a,b), nil 
} 

如果你想要做不同的事情保鲜膜,这取决于它的参数类型,您可以通过使用式开关这样做:

func addInts(a, b int) int { 
    return a + b; 
} 

func addFloat64s(a, b float64) float64 { 
    return a + b; 
} 

wrap := func(args ...interface{}) interface{} { 
    switch args[0].(type) { 
    case int: return interface{}(addInts(args[0].(int), args[1].(int))) 
    case float64: return interface{}(addFloat64s(args[0].(float64), args[1].(float64))) 
    } 
} 

请注意,这最后一个版本的包装使得所有给定的参数将具有相同的类型并给出至少2个参数的假设。