🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
> # json.Number - json.Marshal,json.Unmarshal 会将 interface 里数值类型转成 float64 ~~~ package main import ( "encoding/json" "fmt" "reflect" ) func main() { m1 := make(map[string]interface{}, 1024) m1["num"] = int(32) v, _ := json.Marshal(m1) var m2 map[string]interface{} json.Unmarshal(v, &m2) fmt.Println(reflect.TypeOf(m2["num"])) //输出float64 } ~~~ - 在处理大整数时会导致精度丢失,为了应对这种情况,Go 提供了 `json.Number` 类型。它允许将 JSON 中的数字以字符串形式存储,从而避免精度丢失。这样可以在之后根据需要手动将其解析为 `int64` 或 `float64`,确保不会因为自动转换而丢失精度 ~~~ package main import ( "encoding/json" "fmt" "math/big" "reflect" ) func main() { m1 := make(map[string]interface{}, 10) num := new(big.Int) num.SetString("12345678901234567891", 10) m1["num"] = num v, _ := json.Marshal(m1) var m2 map[string]interface{} json.Unmarshal(v, &m2) fmt.Println(reflect.TypeOf(m2["num"])) //输出 float64 fmt.Println(m2["num"]) //输出:12345678901234567000 精度丢失 } ~~~ ~~~ package main import ( "bytes" "encoding/json" "fmt" "math/big" "reflect" ) func main() { m1 := make(map[string]interface{}, 10) num := new(big.Int) num.SetString("12345678901234567891", 10) m1["num"] = num v, _ := json.Marshal(m1) decoder := json.NewDecoder(bytes.NewReader(v)) decoder.UseNumber() //告诉 JSON 解码器在解析数字时使用 json.Number 类型,而不是将数字直接解码为 float64。这样可以避免在处理大数字时出现精度丢失的问题 var m2 map[string]interface{} decoder.Decode(&m2) fmt.Println(reflect.TypeOf(m2["num"])) //输出 json.Number fmt.Println(m2["num"]) //输出:12345678901234567891 } ~~~ > # gob - 适合 Go 内部使用,效率高,适合在 Go 应用之间传输复杂数据结构。