Q
功能類型轉換
-1
A
回答
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個參數的假設。
相關問題
- 1. 類類型轉換:爲什麼類型轉換功能不叫
- 2. 功能類型轉換的JavaScript
- 3. 轉換算符對類型功能
- 4. 功能指針類型轉換
- 5. 轉換功能型Golang
- 6. 轉換功能ES6類
- 7. 轉換功能到另一種類型(功能鑄造)在轉到
- 8. C#泛型類型轉換Decimal轉換爲Float - 「不能轉換類型'T1'? 'T2'「
- 9. 如何使一個泛型類型轉換功能
- 10. 轉換功能,使一些類型的類的實例
- 11. 類的名稱,類型轉換冪等功能
- 12. 轉換功能
- 13. LINQ功能上型轉換失敗
- 14. 轉換此功能使用泛型
- 15. 泛型:類型不能隱式轉換
- 16. java.lang.ClassCastException:java.lang.String不能轉換爲類別類型
- 17. 轉換爲非標量類型請求(功能)
- 18. 如何將ML VectorUDT功能從.mllib轉換爲.ml類型
- 19. 線程功能是給類型轉換錯誤
- 20. 在mysql中尋找類型轉換功能
- 21. 類型轉換功能於一體用C
- 22. 的Javascript功能轉換聲明爲功能字典原型
- 23. CXF轉換功能
- 24. ESB轉換功能
- 25. 轉換功能,PHP
- 26. 類型轉換類
- 27. 轉換類型
- 28. 類型轉換
- 29. 類型轉換++
- 30. 轉換類型