Golang,Go:Go中的(重新发布)通用总和

3 generics go

http://play.golang.org/p/y7G1fMSoVa

我很抱歉.我不小心删除了我之前的问题.这是我的第二次尝试.

我知道Go不支持泛型类型,但应该有一种方法可以做到这一点.

我试图添加任何类型的两个参数,并使用interface和type assertion返回结果.但我被困在了

  1. (+)未在界面中定义

  2. 想不出我应该回归的类型

这是我上一步.

   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)

永远谢谢.

nem*_*emo 5

在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)