3

「+、- *、/ をサポートする型」をインターフェイスでキャプチャできますか? または、すべての数値型で関数を作成する場合は、typeswitch を使用する必要がありますか?

4

2 に答える 2

3

インターフェイスは、型が実装する一連のメソッドを定義します。Goでは、基本型にはメソッドがありません。それらが満たす唯一のインターフェースは、空のインターフェースですinterface{}

すべての数値タイプで作業する場合は、リフレクトスイッチとタイプスイッチを組み合わせて使用​​できます。タイプスイッチのみを使用する場合は、より多くのコードがありますが、より高速になるはずです。リフレクトを使用すると、処理は遅くなりますが、必要なコードははるかに少なくなります。

Goでは、関数をすべての数値型で機能させようとしないことが非常に一般的であることを覚えておいてください。それが必要になることはめったにありません。

タイプスイッチの例:

func square(num interface{}) interface{} {
    switch x := num.(type) {
    case int:
        return x*x
    case uint:
        return x*x
    case float32:
        return x*x
    // many more numeric types to enumerate
    default:
        panic("square(): unsupported type " + reflect.TypeOf(num).Name())
    }
}

リフレクト+タイプスイッチの例:

func square(num interface{}) interface{} {
    v := reflect.ValueOf(num)
    ret := reflect.Indirect(reflect.New(v.Type()))

    switch v.Type().Kind() {
    case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
        x := v.Int()
        ret.SetInt(x * x)
    case reflect.Uint, reflect.Uintptr, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
        x := v.Uint()
        ret.SetUint(x * x)
    case reflect.Float32, reflect.Float64:
        x := v.Float()
        ret.SetFloat(x * x)
    default:
        panic("square(): unsupported type " + v.Type().Name())
    }

    return ret.Interface()
}
于 2012-12-26T14:58:35.973 に答える
1

事前に宣言された型にはメソッドが付加されていません。

算術演算子は、いくつかのインターフェイスのメソッドセットとして宣言できますが、たとえば、メソッド'Add'、'Sub'など。多型の'+'、'-'、...演算子が行うことを再定義する方法はありません。

于 2012-12-26T15:15:22.203 に答える