我想知道如何在 Go 中連續寫入同一個檔案?我必須使用os.WriteAt()
嗎?
JSON 基本上只是一個充滿結構的陣列:
[
{
"Id": "2817293",
"Data": "XXXXXXX"
},
{
"Id": "2817438",
"Data": "XXXXXXX"
}
...
]
我想要連續的正確資料,即在關閉檔案之前多次附加到該 JSON 陣列。我要寫入檔案的資料是所述結構的一部分:
dataToWrite := []struct{
Id string
Data string
}{}
在 Go 中連續寫入 JSON 陣列的正確方法是什么?
我目前的方法在 JSON 檔案中創建多個切片,因此不是我想要的。寫入程序(位于 for 回圈中)如下所示:
...
// Read current state of file
data := []byte{}
f.Read(data)
// Write current state to slice
curr := []Result{}
json.Unmarshal(data, &curr)
// Append data to the created slice
curr = append(curr, *initArr...)
JSON, _ := JSONMarshal(curr)
// Empty data container
initArr = &[]Result{}
// Write
_, err := f.Write(JSON)
if err != nil {
log.Fatal(err)
}
...
uj5u.com熱心網友回復:
將開頭寫入[
檔案。在檔案上創建一個編碼器。回圈切片和每個切片的元素。如果它不是第一個切片元素,則寫一個逗號。使用編碼器對每個切片元素進行編碼。寫結束語]
。
_, err := f.WriteString("[")
if err != nil {
log.Fatal(err)
}
e := json.NewEncoder(f)
first := true
for i := 0; i < 10; i {
// Create dummy slice data for this iteration.
dataToWrite := []struct {
Id string
Data string
}{
{fmt.Sprintf("id%d.1", i), fmt.Sprintf("data%d.1", i)},
{fmt.Sprintf("id%d.2", i), fmt.Sprintf("data%d.2", i)},
}
// Encode each slice element to the file
for _, v := range dataToWrite {
// Write comma separator if not the first.
if !first {
_, err := f.WriteString(",\n")
if err != nil {
log.Fatal(err)
}
}
first = false
err := e.Encode(v)
if err != nil {
log.Fatal(err)
}
}
}
_, err = f.WriteString("]")
if err != nil {
log.Fatal(err)
}
https://go.dev/play/p/Z-T1nxRIaqL
如果將所有切片元素保存在記憶體中是合理的,則通過在單個批次中編碼所有資料來簡化代碼:
type Item struct {
Id string
Data string
}
// Collect all items to write in this slice.
var result []Item
for i := 0; i < 10; i {
// Generate slice for this iteration.
dataToWrite := []Item{
{fmt.Sprintf("id%d.1", i), fmt.Sprintf("data%d.1", i)},
{fmt.Sprintf("id%d.2", i), fmt.Sprintf("data%d.2", i)},
}
// Append slice generated in this iteration to the result.
result = append(result, dataToWrite...)
}
// Write the result to the file.
err := json.NewEncoder(f).Encode(result)
if err != nil {
log.Fatal(err)
}
https://go.dev/play/p/01xmVZg7ePc
uj5u.com熱心網友回復:
如果您不關心現有檔案,您可以Encoder.Encode
像@redblue 提到的那樣在整個切片上使用。
如果您有要追加到的現有檔案,最簡單的方法是執行您在編輯中顯示的操作:Unmarshal
或Decoder.Decoder
將整個檔案放入一個結構切片,將新結構附加到切片,然后重新解碼大量使用Marshal
or Encoder.Encode
。
如果您有大量資料,您可能需要考慮使用JSON Lines來避免尾隨,
和]
問題,并每行撰寫一個 JSON 物件。或者您可以使用常規 JSON,從檔案末尾回溯,以便覆寫 final ]
,然后撰寫 a ,
,新的 JSON 編碼結構,最后 a]
使檔案再次成為有效的 JSON 陣列。
因此,這在一定程度上取決于您的用例和采用哪種方法的資料大小。
uj5u.com熱心網友回復:
注意
此答案是solution
或者workaround
如果您關心現有檔案的內容!
這意味著它允許您附加到existing
json
由您的API
.
顯然這只適用于相同結構的陣列
實際作業的 json 格式:
[
object,
...
object,
]
寫入檔案時,請勿寫入[
and ]
。只需附加到寫入序列化json
物件的檔案并附加一個,
實際檔案內容:
object,
...
object,
最后在讀取檔案時[
添加和附加]
這樣,您可以write
從多個來源獲取檔案并且仍然有效JSON
還要加載檔案并為您的處理器提供有效輸入json
。
我們像這樣撰寫我們的日志檔案并json
通過REST
呼叫提供一個 vaild,然后對其進行處理(例如由 a JavaScript
Grid
)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/485172.html