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 解析錯誤,即 eof
、unexpected 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中文網其他相關文章!