2023-12-03 16:20:46 +08:00
|
|
|
package convx
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"errors"
|
2024-10-28 21:07:49 +08:00
|
|
|
"math/big"
|
2023-12-03 16:20:46 +08:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// interface 转 int64
|
|
|
|
|
func ToInt64(val interface{}) (i int64, err error) {
|
2024-10-27 22:19:20 +08:00
|
|
|
if val == nil {
|
|
|
|
|
return 0, errors.New("value is nil")
|
|
|
|
|
}
|
2023-12-03 16:20:46 +08:00
|
|
|
|
2024-10-28 20:02:37 +08:00
|
|
|
switch v := val.(type) {
|
|
|
|
|
case int:
|
|
|
|
|
return int64(v), nil
|
|
|
|
|
case int8:
|
|
|
|
|
return int64(v), nil
|
|
|
|
|
case int16:
|
|
|
|
|
return int64(v), nil
|
|
|
|
|
case int32:
|
|
|
|
|
return int64(v), nil
|
|
|
|
|
case int64:
|
|
|
|
|
return v, nil
|
|
|
|
|
case uint:
|
|
|
|
|
return int64(v), nil
|
|
|
|
|
case uint8:
|
|
|
|
|
return int64(v), nil
|
|
|
|
|
case uint16:
|
|
|
|
|
return int64(v), nil
|
|
|
|
|
case uint32:
|
|
|
|
|
return int64(v), nil
|
|
|
|
|
case uint64:
|
|
|
|
|
return int64(v), nil
|
|
|
|
|
case float32:
|
|
|
|
|
return int64(v), nil
|
|
|
|
|
case float64:
|
|
|
|
|
return int64(v), nil
|
|
|
|
|
case string:
|
2024-10-28 21:07:49 +08:00
|
|
|
num := new(big.Float)
|
|
|
|
|
_, ok := num.SetString(v)
|
|
|
|
|
if !ok {
|
|
|
|
|
return 0, errors.New("convx.ToInt64: out of range")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
i, _ := num.Int64()
|
|
|
|
|
// fmt.Println(val, i, b)
|
|
|
|
|
return i, nil
|
2024-10-28 20:02:37 +08:00
|
|
|
case bool:
|
2023-12-03 16:20:46 +08:00
|
|
|
if v {
|
2024-10-28 20:02:37 +08:00
|
|
|
return 1, nil
|
2023-12-03 16:20:46 +08:00
|
|
|
} else {
|
2024-10-28 20:02:37 +08:00
|
|
|
return 0, nil
|
2023-12-03 16:20:46 +08:00
|
|
|
}
|
|
|
|
|
}
|
2024-10-28 20:02:37 +08:00
|
|
|
return 0, errors.New("convx.ToInt64: unknown type")
|
2023-12-03 16:20:46 +08:00
|
|
|
}
|