package convx import ( "errors" "math/big" ) // interface 转 int64 func ToInt64(val interface{}) (i int64, err error) { if val == nil { return 0, errors.New("value is nil") } 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: 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 case bool: if v { return 1, nil } else { return 0, nil } } return 0, errors.New("convx.ToInt64: unknown type") }