本文分析Go服务返回JSON时,Int64字段值超出JavaScript Number.MAX_SAFE_INTEGER导致前端精度丢失的问题。通过对比Go Int64最大值与JS最大安全整数,说明差异原因,并提供将Int64字段序列化为字符串的解决方案,确保前后端数据交互准确。
问题背景与现象
近期在项目开发中,后端Go服务向前端提供接口并返回JSON格式数据。由于JSON中包含Int64类型的字段,其数值可能超过JavaScript中Number类型所能表示的最大整数值,从而导致精度丢失。为规避此风险,可将相关字段以字符串形式返回。
问题描述
Go服务返回的JSON数据结构中,字段deviceId_O的值为:144115188584281742。

前端接收到的deviceId_O数值变为:144115188584281730。末尾两位数字发生变化,导致无论前端如何调试均无法成功获取正确数据。

该问题定位较为直接,只需对比调试工具中的Preview(预览)与Response(响应)数据即可发现差异。尽管初次遇到此类情况可能感到困惑,但通过对比即可明确问题所在。
JavaScript Number最大安全整数限制
Javascript Number 最大值
JavaScript的Number对象提供了MAX_SAFE_INTEGER属性,其固定值为:9007199254740991。当数值超出此范围时,计算结果将不再安全。具体表现可参考相关示例。

Go Int64最大值对比
Go Int64 最大值
通过以下代码获取int64类型的最大值,结果为:9223372036854775807。
i64 := int64(^uint(0) >> 1)
fmt.Println(i64)

解决方案:字符串序列化
解决方案
在Go服务生成JSON响应时,将Int64字段转换为字符串类型返回,即可解决上述精度丢失问题。例如,文中第一张图所示的deviceId字段即采用此方式返回。
以上内容为本文的全部讲解,希望对读者的学习有所帮助,也欢迎大家继续支持本站。