如何處理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]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章