go int64序列化精度丢失问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/meifannao789456/article/details/88067210

数据由map[string]int64 变成map[string]interface{}时, 数据会发生变化

json 在处理go的数据类型转换时,有个对应关系:

数据类型 JSON Golang
字符串 string string
整数 number int64
浮点数 number flaot64
数组 arrary slice
对象 object struct
布尔 bool bool
空值 null nil

在将数字类型unmarshal 转化为interface{} 的时候,默认会先使用浮点数转换,这样,可能会丢失精度。那如何处理?反序列化的时候,将数据类型转换为json.Number 就ok,这样数据会延迟转换,后面可以根据需要转换为int64 或者是 float ,也可以是string。

给个正确的例子,应该使用UseNumber 反序列化:

package main

import (
	"bytes"
	"encoding/json"
	"fmt"
)

type Account struct {
	Email    string `json:"email"`
	Password string `json:"password"`
	Money    int64  `json:"money"`
}

func main() {
	account := Account{
		Email:    "[email protected]",
		Password: "123",
		Money:    int64(72057594088097496),
	}

	deal(account)

}


func deal(data interface{}) {
	bdata, err := json.Marshal(data)

	fmt.Printf("err %v, str %+v\n", err, string(bdata))

	var val map[string]interface{}

	d := json.NewDecoder(bytes.NewBuffer(bdata))
	d.UseNumber()
	err = d.Decode(&val)

	fmt.Printf("err %v, str %+v\n", err, val)

}

猜你喜欢

转载自blog.csdn.net/meifannao789456/article/details/88067210