Голанг отстаивает любое число, чтобы отпустить - PullRequest
0 голосов
/ 24 апреля 2018

Я использую библиотеку, которая принимает только 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 на тип.

Я уверен, что где-то есть что-то более эффективное / элегантное!

Спасибо

1 Ответ

0 голосов
/ 24 апреля 2018

Правильный способ сделать это будет выглядеть так: 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...