最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談golang的json.Unmarshal的坑

 更新時(shí)間:2023年01月05日 08:55:18   作者:知魚(yú)君  
本文主要介紹了淺談golang的json.Unmarshal的坑,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

最近在golang業(yè)務(wù)開(kāi)發(fā)時(shí),遇到一個(gè)坑。

我們有個(gè)服務(wù),會(huì)接收通用的interface對(duì)象,然后去給用戶發(fā)消息。因此會(huì)涉及到把各個(gè)業(yè)務(wù)方傳遞過(guò)來(lái)的字符串,轉(zhuǎn)成interface對(duì)象。

但是因?yàn)槲业淖址镉幸粋€(gè)數(shù)字,比如下面demo里的{"number":1234567},而且數(shù)字是7位數(shù),在經(jīng)過(guò)json.Unmarshal后,被轉(zhuǎn)成了科學(xué)計(jì)數(shù)法的形式,導(dǎo)致私信發(fā)出的鏈接出現(xiàn)異常,結(jié)果報(bào)錯(cuò)了。

package main

import (
   "encoding/json"
   "fmt"
)

func main() {
   jsonStr := `{"number":1234567}`
   result := make(map[string]interface{})
   err := json.Unmarshal([]byte(jsonStr), &result)
   if err != nil {
      fmt.Println(err)
   }
   fmt.Println(result) // map[number:1.234567e+06]

}

當(dāng)數(shù)據(jù)結(jié)構(gòu)未知,使用 map[string]interface{} 來(lái)接收反序列化結(jié)果時(shí),如果數(shù)字的位數(shù)大于 6 位,都會(huì)變成科學(xué)計(jì)數(shù)法,用到的地方都會(huì)受到影響。

encoding/json包中,可以找到下面一段注釋:

//
// To unmarshal JSON into an interface value,
// Unmarshal stores one of these in the interface value:
//
// bool, for JSON booleans
// float64, for JSON numbers
// string, for JSON strings
// []interface{}, for JSON arrays
// map[string]interface{}, for JSON objects
// nil for JSON null
//

對(duì)于數(shù)字來(lái)說(shuō),會(huì)被解析成 float64 類型,就有可能會(huì)出現(xiàn)科學(xué)計(jì)數(shù)法的形式。

問(wèn)題解決方案1:強(qiáng)制類型轉(zhuǎn)換

func main() {
   jsonStr := `{"number":1234567}`
   result := make(map[string]interface{})
   err := json.Unmarshal([]byte(jsonStr), &result)
   if err != nil {
      fmt.Println(err)
   }
   fmt.Println(int(result["number"].(float64)))

   // 輸出
   // 1234567
}

問(wèn)題解決方案2:盡量避免使用 interface,對(duì) json 字符串結(jié)構(gòu)定義結(jié)構(gòu)體

func main() {
   type Num struct {
      Number int `json:"number"`
   }

   jsonStr := `{"number":1234567}`
   var result Num
   err := json.Unmarshal([]byte(jsonStr), &result)
   if err != nil {
      fmt.Println(err)
   }
   fmt.Println(result)

   // 輸出
   // {1234567}
}

參考文檔:http://m.fzitv.net/article/190537.htm

到此這篇關(guān)于淺談golang的json.Unmarshal的坑的文章就介紹到這了,更多相關(guān)golang json.Unmarshal內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Golang中基礎(chǔ)的命令行模塊urfave/cli的用法說(shuō)明

    Golang中基礎(chǔ)的命令行模塊urfave/cli的用法說(shuō)明

    這篇文章主要介紹了Golang中基礎(chǔ)的命令行模塊urfave/cli的用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • goland 實(shí)現(xiàn)websocket server的示例代碼

    goland 實(shí)現(xiàn)websocket server的示例代碼

    本文主要介紹了goland 實(shí)現(xiàn)websocket server的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • Go 語(yǔ)言 select 的實(shí)現(xiàn)原理解析

    Go 語(yǔ)言 select 的實(shí)現(xiàn)原理解析

    select是Go在語(yǔ)言層面提供的I/O多路復(fù)用的機(jī)制,其專門(mén)用來(lái)讓Goroutine同時(shí)等待多個(gè)channel是否準(zhǔn)備完畢:可讀或可寫(xiě),這篇文章主要介紹了Go 語(yǔ)言 select 的實(shí)現(xiàn)原理,需要的朋友可以參考下
    2025-01-01
  • 通過(guò)client-go來(lái)操作K8S集群的操作方法

    通過(guò)client-go來(lái)操作K8S集群的操作方法

    本文詳細(xì)介紹了client-go的安裝、配置和使用方法,并通過(guò)示例代碼展示了如何進(jìn)行常見(jiàn)的Kubernetes操作,希望這些內(nèi)容能幫助大家更好地理解和使用client-go,從而提高你的Kubernetes開(kāi)發(fā)效率,感興趣的朋友一起看看吧
    2024-11-11
  • Go?gRPC服務(wù)proto數(shù)據(jù)驗(yàn)證進(jìn)階教程

    Go?gRPC服務(wù)proto數(shù)據(jù)驗(yàn)證進(jìn)階教程

    這篇文章主要為大家介紹了Go?gRPC服務(wù)proto數(shù)據(jù)驗(yàn)證進(jìn)階教程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • go 異常處理panic和recover的簡(jiǎn)單實(shí)踐

    go 異常處理panic和recover的簡(jiǎn)單實(shí)踐

    在Go語(yǔ)言中,異常處理主要通過(guò)panic和recover這兩個(gè)內(nèi)建函數(shù)來(lái)實(shí)現(xiàn),本文主要介紹了go異常處理panic和recover的簡(jiǎn)單實(shí)踐,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-04-04
  • Golang指針隱式間接引用詳解

    Golang指針隱式間接引用詳解

    在 Go中,指針隱式解引用是指通過(guò)指針直接訪問(wèn)指針?biāo)赶虻闹担恍枰@式地使用 * 運(yùn)算符來(lái)解引用指針,這篇文章主要介紹了Golang指針隱式間接引用,需要的朋友可以參考下
    2023-05-05
  • Golang?中的?unsafe.Pointer?和?uintptr詳解

    Golang?中的?unsafe.Pointer?和?uintptr詳解

    這篇文章主要介紹了Golang中的unsafe.Pointer和uintptr詳解,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下
    2022-08-08
  • Go處理JSON數(shù)據(jù)的實(shí)現(xiàn)

    Go處理JSON數(shù)據(jù)的實(shí)現(xiàn)

    本文主要介紹了Go處理JSON數(shù)據(jù)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • 詳解Go語(yǔ)言微服務(wù)開(kāi)發(fā)框架之Go chassis

    詳解Go語(yǔ)言微服務(wù)開(kāi)發(fā)框架之Go chassis

    分布式系統(tǒng)中每個(gè)進(jìn)程的動(dòng)態(tài)配置管理及運(yùn)行時(shí)熱加載就成為了一個(gè)亟待解決的問(wèn)題。go chassis汲取了netflix的archaius框架經(jīng)驗(yàn),并做出來(lái)自己的創(chuàng)新特性。
    2021-05-05

最新評(píng)論

揭西县| 临颍县| 禹州市| 清新县| 蚌埠市| 井研县| 奉贤区| 来凤县| 平陆县| 巢湖市| 乌兰浩特市| 城步| 灌南县| 内江市| 于都县| 柏乡县| 乌苏市| 六枝特区| 保靖县| 瑞昌市| 永平县| 上思县| 固始县| 鸡西市| 三亚市| 讷河市| 新丰县| 姚安县| 晋江市| 永福县| 申扎县| 栾城县| 饶河县| 阜阳市| 阳信县| 石景山区| 深州市| 潞城市| 武平县| 中山市| 原阳县|