前言
在golang中,当浮点数超过一定数值的时候,golang会把它弄成科学计数法的形式进行显示(好像只要大于七位数就变成科学计数法了)
var val float64 val = 1000000 fmt.Println(val) // ==> 1e+06
而在日常开发中,我们经常遇到这样一个问题,就是要反序列化前端传递来的json,因为数据结构未知,所以我们便会使用map[string]interface{}
来接收反序列化的结果。由于golang将json解析到interface{}
类型的时候,遵循如下规则
- bool 代表 JSON booleans,
- float64 代表 JSON numbers,
- string 代表 JSON strings,
- nil 代表 JSON null.
所以如果我们接收到的json中存在一个比较大的数字,那么它就会被解析成float64类型的,并且有可能显示为科学计数法的形式,比如下面这个例子
package main import ( "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 main import ( "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]
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。