我使用的库只接受float64
作为函数参数,但我的代码可以在interface{}
中发布任意类型的数字,这意味着int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64, float32, float64
。
如何编写一个优雅的函数来断言所有这些类型?
我想的是:
if i, ok := event.Value.(int); ok {
value = float64(i)
} else if f, ok := event.Value.(float64); ok {
value = f
} else {
... error and return
}
每种类型一个else if
。
我确定某处有更高效/优雅的东西!
由于
答案 0 :(得分:4)
正确的做法是:https://play.golang.org/p/_evcLsjcXY-
var x interface{}
x = int64(12)
var y float64
switch v := x.(type) {
case int:
y = float64(v)
case int8:
y = float64(v)
case int16:
y = float64(v)
case int32:
y = float64(v)
case int64:
y = float64(v)
case uint:
y = float64(v)
case uint8:
y = float64(v)
case uint16:
y = float64(v)
case uint32:
y = float64(v)
case uint64:
y = float64(v)
case float32:
y = float64(v)
case float64:
y = v
}
fmt.Println(y)
如果你不关心性能/安全/等等,只是想要一些简短的东西(不要这样做):
var x interface{}
x = int64(12)
tmp, _ := json.Marshal(x)
var y float64
json.Unmarshal(tmp, &y)
fmt.Println(y)
或者,您可以使用反射https://play.golang.org/p/QYQP00KicmF:
import "reflect"
var floatType = reflect.TypeOf(float64(0))
func getFloat(unk interface{}) (float64, error) {
v := reflect.ValueOf(unk)
v = reflect.Indirect(v)
if !v.Type().ConvertibleTo(floatType) {
return 0, fmt.Errorf("cannot convert %v to float64", v.Type())
}
fv := v.Convert(floatType)
return fv.Float(), nil
}