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

解決Go?Json?Unmarshal反序列化丟失數(shù)字精度問題

 更新時間:2023年08月08日 14:22:53   作者:cli  
業(yè)務會使用?id生成器?產(chǎn)生的?分布式唯一ID,長度比較長,所以代碼反序列化時,會出現(xiàn)精度丟失問題,那如何解決呢,下面小編就來和大家詳細講講

現(xiàn)象

業(yè)務會使用 id生成器 產(chǎn)生的 分布式唯一ID,長度比較長。代碼反序列化時,出現(xiàn)精度丟失,導致線上故障。

package main
import (
   "testing"
   "time"
   "github.com/bytedance/sonic"
   "github.com/stretchr/testify/assert"
)
func TestPrintAttr(t *testing.T) {
   amap := map[string]any{
      "psm_businessline_ref": map[string]any{
         "id": 1691071059696833999,
      },
   }
   amapStr, err := sonic.MarshalString(amap)
   assert.Nil(t, err)
   t.Log("\n", amapStr)
   m1 := make(map[string]any)
   err = sonic.UnmarshalString(amapStr, &m1)
   assert.Nil(t, err)
}

原因

  • 反序列化時,對于數(shù)值類型的value,默認會反序列化成float64類型。
  • float64可以存儲的最大整數(shù)是52位尾數(shù)全位1且指數(shù)部分為最大 0x07FEF FFFF FFFF FFFF

(0x001F FFFF FFFF FFFF)16 = (9007199254740991)10 
(0x07EF FFFF FFFF FFFF)16 = (9218868437227405311)10 

也就是理論上數(shù)值超過9007199254740991(長度=16)就可能會出現(xiàn)精度缺失。

10進制數(shù)值的有效數(shù)字是16位,一旦超過16位大概率會有缺失精度的問題

一般分布式唯一id是20位長度,所以必然出現(xiàn)精度缺失。

參考:

解決方案

使用 json.Decoder 來代替 json.Unmarshal 方法

package main
import (
   "testing"
   "time"
   "github.com/bytedance/sonic"
   "github.com/stretchr/testify/assert"
)
func TestPrintAttr(t *testing.T) {
   amap := map[string]any{
      "psm_businessline_ref": map[string]any{
         "id": 1691071059696833999,
      },
   }
   amapStr, err := sonic.MarshalString(amap)
   assert.Nil(t, err)
   t.Log("\n", amapStr)
   rightM := make(map[string]any)
   if len(amapStr) > 0 {
      de := jsoniter.NewDecoder(bytes.NewReader([]byte(amapStr)))
      de.UseNumber()
      err := de.Decode(&rightM)
      if err != nil {
         t.Fatal(err)
      }
   }
}

json.Number本質(zhì)是string,反序列化的時候?qū)?strong>json的數(shù)值轉(zhuǎn)成字符串,而字符串不會有精度丟失問題,所以沒有問題。json.Number如下:

package json
// A Number represents a JSON number literal.
type Number string

到此這篇關于解決Go Json Unmarshal反序列化丟失數(shù)字精度問題的文章就介紹到這了,更多相關Go Json Unmarshal內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Go語言字符串及strings和strconv包使用實例

    Go語言字符串及strings和strconv包使用實例

    字符串是工作中最常用的,值得我們專門的練習一下,下面這篇文章主要給大家介紹了關于Go語言字符串及strings和strconv包使用的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-06-06
  • 使用Go語言啟動Redis的實例詳解

    使用Go語言啟動Redis的實例詳解

    這篇文章主要為大家介紹了Go語言中一個可以用來啟動?redis-server?的開源庫?github.com/stvp/tempredis,感興趣的小伙伴可以跟隨小編一起學習一下
    2025-01-01
  • Golang?channel為什么不會阻塞的原因詳解

    Golang?channel為什么不會阻塞的原因詳解

    這篇文章主要為大家介紹了Golang?channel為什么不會阻塞的原因詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • 詳解Golang中創(chuàng)建error的方式總結(jié)與應用場景

    詳解Golang中創(chuàng)建error的方式總結(jié)與應用場景

    Golang中創(chuàng)建error的方式包括errors.New、fmt.Errorf、自定義實現(xiàn)了error接口的類型等,本文主要為大家介紹了這些方式的具體應用場景,需要的可以參考一下
    2023-07-07
  • Go語言正則表達式示例

    Go語言正則表達式示例

    這篇文章主要介紹了Go語言正則表達式,結(jié)合實例形式分析了Go語言正則表達式實現(xiàn)字符串的匹配、查找等相關操作技巧,需要的朋友可以參考下
    2017-01-01
  • golang gc的內(nèi)部優(yōu)化詳細介紹

    golang gc的內(nèi)部優(yōu)化詳細介紹

    Go編譯器在垃圾回收(GC)的掃描標記階段,對存儲無指針鍵值對的map進行了優(yōu)化,即在GC掃描時不深入掃描map內(nèi)部數(shù)據(jù),只檢查map本身是否需要回收,這一優(yōu)化顯著提升了GC掃描的速度,從而減少了GC對程序性能的影響
    2024-10-10
  • Golang全局變量加鎖的問題解決

    Golang全局變量加鎖的問題解決

    這篇文章主要介紹了解決Golang全局變量加鎖的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • Go語言字符串操作指南:簡單易懂的實戰(zhàn)技巧

    Go語言字符串操作指南:簡單易懂的實戰(zhàn)技巧

    本文將介紹Go語言中字符串的實戰(zhàn)操作,通過本文的學習,讀者將掌握Go語言中字符串的常用操作,為實際開發(fā)提供幫助,需要的朋友可以參考下
    2023-10-10
  • Golang學習筆記(一):簡介

    Golang學習筆記(一):簡介

    這篇文章主要介紹了Golang學習筆記(一):簡介,本文講解了Go語言最主要的特性、安裝、環(huán)境變量設置、整體目錄結(jié)構、Helloworld、go命令、調(diào)試、編輯器設置等內(nèi)容,需要的朋友可以參考下
    2015-05-05
  • go常用指令之go?mod詳解

    go常用指令之go?mod詳解

    當go命令運行時,它查找當前目錄然后查找相繼的父目錄來找出 go.mod,下面這篇文章主要給大家介紹了關于go常用指令之go?mod的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-08-08

最新評論

克拉玛依市| 霞浦县| 潞城市| 桐梓县| 绥芬河市| 临桂县| 江都市| 墨竹工卡县| 砀山县| 云南省| 安乡县| 长沙县| 汶川县| 若羌县| 治县。| 从化市| 新沂市| 浪卡子县| 奉新县| 宜章县| 永靖县| 衡阳市| 黎川县| 女性| 八宿县| 寿光市| 玉门市| 元阳县| 北票市| 长沙市| 阳江市| 临潭县| 通江县| 永寿县| 庆安县| 巴林右旗| 云霄县| 双柏县| 芦溪县| 崇阳县| 怀集县|