首頁  >  文章  >  後端開發  >  json.Unmarshal 檔案資料有效,但 json.NewDecoder().Decode() 無效

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

WBOY
WBOY轉載
2024-02-09 12:15:31819瀏覽

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刪除