如何处理Golang中int64类型变为科学计数法?

Posted 咖啡色的羊驼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何处理Golang中int64类型变为科学计数法?相关的知识,希望对你有一定的参考价值。

背景

这周时候在处理订单消息传递的时候,发现定义的orderID大多数时候是正常的(例如:1152921570135310348)偶现科学计数法(例如:1.1529215701353103e+18)。

传参的结构是这样的:map[string]interface
赋值:data[“id”] = 1152921570135310348

后面就开始调接口,记录日志等一系列操作。查了一会儿发现正常流程是不会导致变成科学计数法的。

后面偶然发现原来的一个通过mq补偿的逻辑导致的。
主要原因是因为走了json.Marshal()导致的。

解决

这里提供两种方式解决这个问题。

1.赋值的时候用string类型

func main() 
	data := make(map[string]interface)
	
	// 关键是这里。主要想表达,用字符串就没问题
	data["id"] = "1152921570135310348"
	dataJson,_ := json.Marshal(data)
	fmt.Println(string(dataJson))
	
	// 解json 
	var dataDecode map[string]interface
	v,_:=strconv.ParseFloat("1000000", 64)
	fmt.Println(v)
	_ = json.Unmarshal(dataJson, &dataDecode)
	fmt.Println(dataDecode)

输出:

"id":"1152921570135310348"
map[id:1152921570135310348]

2.使用json的useNumber属性

func main() 
	data := make(map[string]interface)
	data["id"] = 1152921570135310348

	dataJson,_ := json.Marshal(data)

	fmt.Println(string(dataJson))
	var dataDecode map[string]interface

	// 关键是这里开始的三行~底层在输出的时候会进行格式化防止出现科学计数法
	d := json.NewDecoder(bytes.NewReader(dataJson))
	d.UseNumber()
	_ = d.Decode(&dataDecode)

	fmt.Println(dataDecode)

输出:

"id":1152921570135310348
map[id:1152921570135310348]

如果你觉得有收获~可以关注我的公众号【咖啡色的羊驼】~第一时间收到我的分享和知识梳理~

以上是关于如何处理Golang中int64类型变为科学计数法?的主要内容,如果未能解决你的问题,请参考以下文章

你如何处理 golang 中的 float64 比较?

prometheus:prometheus如何处理数据类型溢出?

64 位计算机如何处理长整数?如何确定对象的大小? [关闭]

GraphQL:如何处理在自己的类型定义中引用类型?

golang channel 超时如何处理

字符串类型数组的指针运算,C++如何处理这个?