【Golang】json技巧之解决前端ID失真问题
javascript
在数字比较大情况下,使用JSON.stringify()
与JSON.parse()
将JSON
序列化为字符串与反序列化js
可理解的数据结构时,会出现数据失真问题。
如图所示:
1.这是为什么?
javascript
没有整形、浮点型,只有number
类型表示数字。而number
类型根据IEEE754
规定,能安全表示的数字范围
$$
-(2^{53}-1) 到(2^{53}-1)
$$
而雪花算法生成的ID是int64,在后端,int64表示的范围
$$
-(2^{63}-1) 到(2^{63}-1)
$$
所以如果后端碰巧给前端的值很大,超过前端number
能够表示的范围,前端收到的值就会失真,始终无法获得正确的ID。
2.怎么解决?
这个问题在很多后端语言和前端对接过程中,都会存在,毕竟我们身处于一个大前端的洪流之中,任尔后端72变,前端岿然不动。
解决方案:使用字符串在前后端传递。
type UserInfo struct{
UserId int64 `json:"userID,string"`
}
Golang
有比较方便的方法:为其tag
增加string
。
- 这样在前端请求后端后,反序列化时,就会把前端字符串反序列化成
int64
; - 后端返回前端前,序列化时,把
int64
序列化为字符串,给到前端;
- 原文作者:Garfield
- 原文链接:http://www.randyfield.cn/post/2021-06-24-front-snow-id/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。