3

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

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

我知道 Go 不支持泛型类型,但应该有办法做到这一点。

我正在尝试添加任何类型的两个参数并使用接口和类型断言返回结果。但我被困在

  1. (+) 未在接口中定义

  2. 想不出我应该返回什么类型

这是我的上一步。

   func Add(val1, val2 interface{}) int {
        new_a := val1.(int)
        new_b := val2.(int)
        return new_a + new_b
   }

这给了我正确的答案,但这没用,因为我知道整数值将被传递。我想要一个不知道会给出什么的函数,并根据给定的变量类型返回加法。

这是我的第二次尝试并被卡住。

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

1 回答 1

6

在 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.")
    }
}

请注意,返回类型是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) )
}
于 2013-10-11T18:46:37.100 回答