2014-03-07 63 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個參數的假設。