什么接口做基本类型实现

时间:2012-12-26 14:37:18

标签: types interface numbers go

您是否可以使用界面捕获“支持+, - *和/的类型?或者,如果要在所有数字类型上创建函数,是否只需要使用typeswitch?

2 个答案:

答案 0 :(得分: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())
    }
}

反映+ Typeswitch示例:

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()
}

答案 1 :(得分:1)

预先申报的类型没有附加方法。

算术运算符可以声明为某个接口的方法集,但仅限于例如。方法'添加','子'等,即。没有办法重新定义多态“+”,“ - ”,...运算符。