【问题标题】:Golang assert any number to floatGolang 断言任何数字浮动
【发布时间】:2018-04-24 18:15:53
【问题描述】:

我使用的库只接受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

我确信在某个地方有更高效/更优雅的东西!

谢谢

【问题讨论】:

标签: go


【解决方案1】:

正确的做法是这样的: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
}

【讨论】:

  • 在开关中使用v := x.(type)。这样您就不必在每种情况下都放置单独的类型断言。
  • 而不是json,也可以这样做:v, _ = strconv.ParseFloat(fmt.Sprint(x),64),但是是的,不要那样做
猜你喜欢
  • 2019-01-01
  • 1970-01-01
  • 2014-01-22
  • 2019-11-03
  • 1970-01-01
  • 2015-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多