3

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

本当に申し訳ない。前の質問を誤って削除してしまいました。これが私の2回目の試みです。

Go がジェネリック型をサポートしていないことは知っていますが、これを行う方法があるはずです。

任意の型の 2 つの引数を追加し、インターフェイスと型アサーションを使用して結果を返そうとしています。しかし、私は立ち往生しています

  1. (+) はインターフェイスで定義されていません

  2. どの型を返すべきか考えられない

これは私の前のステップです。

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

これで正しい答えが得られますが、整数値が渡されることがわかっているため、これは役に立ちません。何が与えられるかわからず、与えられた変数の型に応じて加算を返す関数が必要です。

これが私の2回目の試行で、行き詰まります。

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 に答える