当整数超过6位的时候,marshal 会变成浮点数,然后parseInt 会失败
strconv.ParseInt: parsing “1.04746e+06”: invalid syntax
特别是业务中处理递增id的时候,要非常小心,最好用ParseFloat 然后转int,禁止使用parseInt
golang strconv.ParseInt 是将字符串转换为数字的函数,功能灰常之强大,看的我口水直流.
func ParseInt(s string, base int, bitSize int) (i int64, err error)
参数1 数字的字符串形式
参数2 数字字符串的进制 比如二进制 八进制 十进制 十六进制
参数3 返回结果的bit大小 也就是int8 int16 int32 int64
Golang 使用 JSON unmarshal 数字到 interface{} 数字变成 float64 类型
这是由于 JSON 里的数字默认都会转成 Golang 的 float64 类型引起的,
使用 Golang 解析 JSON 格式数据时,若以 interface{} 接收数据,则会按照下列规则进行解析:
bool, for JSON booleans
float64, for JSON numbers
string, for JSON strings
[]interface{}, for JSON arrays
map[string]interface{}, for JSON objects
nil for JSON null
而浮点数打印时的默认规则是超过一定长度后会换成科学计数法打印。
因此,只要在打印时指定打印格式,或者(按照LZ示例里是整数的情况时),转换为整数打印
fmt.Println( int( a[“id”].(float64) ) ) // 将 “id” 键申明为 float64 类型,再转换为 int 型
遇到的坑
func parseInt64(a int64){
var ai interface{}
as, _ := nativejson.Marshal(a)
nativejson.Unmarshal(as, &ai)
it, err := strconv.ParseInt(fmt.Sprint(ai), 10, 64)
fmt.Println(it,err)
f64, err := strconv.ParseFloat(fmt.Sprint(ai),64)
fmt.Println(f64,err)
fmt.Println(int64(f64),int32(f64))
fmt.Println("-------------") }
func main() {
parseInt64(104746)
parseInt64(1047460) }
104746
104746
104746 104746
-------------
0 strconv.ParseInt: parsing "1.04746e+06": invalid syntax
1.04746e+06
1047460 1047460
-------------
当整数超过6位的时候,marshal 会变成浮点数,然后parseInt 会失败
strconv.ParseInt: parsing “1.04746e+06”: invalid syntax
特别是业务中处理递增id的时候,要非常小心,最好用ParseFloat 然后转int,禁止使用parseInt
注意只有interface{}才会出现问题,下面这个仍然是正常的
it, err := strconv.ParseInt(fmt.Sprint(“1047460”), 10, 64)
fmt.Println(it,err)
1047460