背景
這周時候在處理訂單消息傳遞的時候,發現定義的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]