首頁 > 後端開發 > Golang > 主體

json.Unmarshal 檔案資料有效,但 json.NewDecoder().Decode() 無效

WBOY
發布: 2024-02-09 12:15:31
轉載
825 人瀏覽過

json.Unmarshal 文件数据有效,但 json.NewDecoder().Decode() 无效

php小編草莓為您介紹一個關於 JSON 解析的問題。有時候我們會遇到這樣的情況,使用 json.Unmarshal 解析檔案資料是有效的,但使用 json.NewDecoder().Decode() 卻無效。這個問題可能出現在程式碼邏輯或資料格式上,下面我們將詳細分析可能的原因,並給出解決方案。

問題內容

以下正確解組該結構:

func foo() {
  d, err := os.readfile("file.json")

  var t t
  if err := json.unmarshal(d, &t); err != nil {
    panic(err)
  }
}
登入後複製

但這不起作用,並會拋出一堆經典的 json 解析錯誤,即 eofunexpected token 't' 等。

func foo() {
  f, err := os.open("file.json")
  
  var t t
  if err := json.newdecoder(f).decode(&t); err != nil {
    panic(err)
  }
}
登入後複製

知道為什麼嗎? os.file[]byte 同時在兩個 goroutine 中使用,json 結構如下(省略部分欄位):

{
  "data": [
    {
      "field": "stuff",
      "num": 123,
    },
    ...
  ]
}
登入後複製

解決方法

os.File[]byte 同時在兩個 goroutine 中使用...

這就是問題所在。 os.File 有一個內部檔案指針,下次讀取發生的位置。如果兩個不相關的實體繼續從中讀取數據,它們可能不會讀取重疊的數據。第一個實體讀取的位元組不會在第二個實體中重複。

此外,os.File 對於並發使用並不安全(文件沒有明確說明它是安全的):從多個並發 goroutine 呼叫其方法可能會導致資料競爭。

當您將 []byte 傳遞給「從中讀取」的多個函數/goroutines 時,沒有共用指標或索引變數。每個函數/goroutine 將分別維護其索引,並且從多個 goroutine 讀取變數是可以的(在本例中是切片頭和切片元素的欄位)。

以上是json.Unmarshal 檔案資料有效,但 json.NewDecoder().Decode() 無效的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:stackoverflow.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!