亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Golang中的XML編碼器不會關閉所有流中的標簽

Golang中的XML編碼器不會關閉所有流中的標簽

Go
泛舟湖上清波郎朗 2023-08-07 14:57:40
我正在開發一個流式 XML 編碼器,它將同時將 XML 寫入本地文件和 S3 存儲桶。然而,通過測試它寫入兩個本地文件,我可以看到其中一個文件每次都缺少結束標簽。我大致是這樣做的(省略錯誤處理):func copyToFile (fileName string) {    f, _ := os.Create(fileName)    defer f.Close()    io.Copy(f, pr)}func main () {    pr, pw := io.Pipe()    defer pw.Close()    encoder := xml.NewEncoder(pw)    go copyToFile("file1.xml")    go copyToFile("file2.xml")    encoder.EncodeToken(xml.StartElement{...})    encoder.Encode(SomeStruct{})    encoder.EncodeToken(xml.EndElement{...})    encoder.Flush()}結果file1.xml符合預期,所有標簽都正確關閉,但file2.xml關閉標簽( 的調用encoder.EncodeToken(xml.EndElement{...}))丟失。我究竟做錯了什么?當我將閱讀器復制到 S3 時,我能得到相同的結果嗎?
查看完整描述

1 回答

?
牛魔王的故事

TA貢獻1830條經驗 獲得超3個贊

返回的數據上不能有多個讀取器io.PipeReader,數據不會為所有讀取器重復。只能io.PipeReader“服務”一個讀者,并且您啟動 2 個 goroutine 來從中讀取。

要實現您想要的效果,請使用io.MultiWriter().?它會向您返回一個io.Writer可以寫入的位置,并將寫入內容復制到您傳遞給它的所有寫入器。

例如:

f1 := &bytes.Buffer{}

f2 := &bytes.Buffer{}


w := io.MultiWriter(f1, f2)


encoder := xml.NewEncoder(w)


encoder.EncodeToken(xml.StartElement{Name: xml.Name{Local: "test"}})

encoder.Encode(image.Point{1, 2})

encoder.EncodeToken(xml.EndElement{Name: xml.Name{Local: "test"}})

encoder.Flush()


fmt.Println(f1)

fmt.Println(f2)

這將輸出(在Go Playground上嘗試):


<test><Point><X>1</X><Y>2</Y></Point></test>

<test><Point><X>1</X><Y>2</Y></Point></test>

上面的示例寫入 2 個內存緩沖區。要寫入 2 個文件,您可以將 2 傳遞給os.File(或io.MultiWriter()任何其他實現io.Writer):


f1, err := os.Create("file1.xml")

if err != nil {

? ? panic(err)

}

defer f1.Close()


f2, err := os.Create("file2.xml")

if err != nil {

? ? panic(err)

}

defer f2.Close()


w := io.MultiWriter(f1, f2)


// ...


查看完整回答
反對 回復 2023-08-07
  • 1 回答
  • 0 關注
  • 122 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號