前言
在golang/299799.html">golang/279492.html">golang中,當浮點數超過一定數值的時候,golang會把它弄成科學計數法的形式進行顯示(好像只要大于七位數就變成科學計數法了)
var val float64val = 1000000fmt.Println(val) // ==> 1e+06
而在日常開發中,我們經常遇到這樣一個問題,就是要反序列化前端傳遞來的json,因為數據結構未知,所以我們便會使用map[string]interface{}
來接收反序列化的結果。由于golang將json解析到interface{}
類型的時候,遵循如下規則
所以如果我們接收到的json中存在一個比較大的數字,那么它就會被解析成float64類型的,并且有可能顯示為科學計數法的形式,比如下面這個例子
package mainimport ( "encoding/json" "fmt")func main() { //Create the Json string var data = ` { "id": 12423434, "Name": "Fernando" } ` //Marshal the json to a map var result map[string]interface{} err := json.Unmarshal([]byte(data), &result) if err != nil { fmt.Println(err.Error()) return } fmt.Println(result)}
輸出如下結果
map[id:1.2423434e+07 Name:Fernando]
這個時候如果把它傳遞給前端使用的話,那么前端是有可能會報錯的。所以我們最好還是保持這個數字的原始字符串表現形式。即使用json.Number
類型來表示
所以換成如下代碼就可以了
package mainimport ( "encoding/json" "fmt" "strings")func main() { //Create the Json string var data = ` { "id": 12423434, "Name": "Fernando" } ` //Marshal the json to a map var result map[string]interface{} d := json.NewDecoder(strings.NewReader(data)) d.UseNumber() err := d.Decode(&result) if err != nil { fmt.Println(err.Error()) return } // 此刻result["id"]的類型就是json.Number了 它的底層類型其實就是string fmt.Println(result)}
輸出如下結果
map[id:12423434 Name:Fernando]
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。
新聞熱點
疑難解答