http://play.golang.org/p/y7G1fMSoVa
我很抱歉.我不小心删除了我之前的问题.这是我的第二次尝试.
我知道Go不支持泛型类型,但应该有一种方法可以做到这一点.
我试图添加任何类型的两个参数,并使用interface和type assertion返回结果.但我被困在了
(+)未在界面中定义
想不出我应该回归的类型
这是我上一步.
func Add(val1, val2 interface{}) int {
new_a := val1.(int)
new_b := val2.(int)
return new_a + new_b
}
Run Code Online (Sandbox Code Playgroud)
这给了我正确的答案,但这是没用的,因为我知道将传递整数值.我想要一个不知道将给出什么的函数,并相应地返回给定的变量类型.
这是我的第二次尝试并被卡住了.
http://play.golang.org/p/-_jvvs09nl
func Add(val1, val2 interface{}) {
// var x interface{} = 7 // x has dynamic type int and value 7
// i := x.(int) // i has type int and value 7
// a := reflect.ValueOf(val1)
// b := reflect.ValueOf(val2)
// fmt.Println(a, b)
// <int Value> <int Value>
type_val1 := reflect.TypeOf(val1)
type_val2 := reflect.TypeOf(val2)
fmt.Println(type_val1, type_val2)
result1 := val1.(type_val1) // ERROR : type_val1 is not a type
result2 := val2.(type_val2) // ERROR : type_val2 is not a type
fmt.Println(result1, result2)
Run Code Online (Sandbox Code Playgroud)
永远谢谢.
在go中没有运算符重载.你无法定义自己的+.
正如您可能已经看到的那样,也没有Add()定义方法reflect.Value.要使用,+您必须获取值的基础类型,然后添加它.您可以使用类型断言来完成此操作.
根据规范 +定义的是整数,浮点数,复数值和字符串.因此,您需要检查值是否是这些类型之一,将其转换为该类型然后添加它.
比赛示例:
func Add(a, b interface{}) (interface{}, error) {
value_a := reflect.ValueOf(a)
value_b := reflect.ValueOf(b)
if value_a.Kind() != value_b.Kind() {
return nil, fmt.Errorf("Different kinds, can't add them.")
}
switch value_a.Kind() {
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
return value_a.Int() + value_b.Int(), nil
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
return value_a.Uint() + value_b.Uint(), nil
case reflect.Float32, reflect.Float64:
return value_a.Float() + value_b.Float(), nil
case reflect.String:
return value_a.String() + value_b.String(), nil
default:
return nil, fmt.Errorf("Type does not support addition.")
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,返回类型interface{}可能有不同的返回类型.
与此相关问题一样,这可以通过使用reflect.MakeFunc(例如播放)来优化:
func main() {
var addInt func(int, int) int64
var addFloat func(float32, float32) float64
makeFunc(AddFunc, &addInt)
makeFunc(AddFunc, &addFloat)
fmt.Println( addInt(1, 1) )
fmt.Println( addFloat(1.0, 3.1415) )
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2193 次 |
| 最近记录: |