我最近遇到了如何從 CSV 文件中讀取、對(duì)每一行應(yīng)用一些轉(zhuǎn)換并寫(xiě)入 HTTP 請(qǐng)求的問(wèn)題。我遇到的問(wèn)題是如何從返回任意字節(jié)數(shù)的逐行讀取器(如掃描儀)轉(zhuǎn)換為字節(jié)讀取器,后者在每次調(diào)用 Read() 時(shí)返回固定數(shù)量的字節(jié)。我想出的最佳解決方案是構(gòu)建一個(gè)自定義的 io.Reader,如果字節(jié)不合適,它將從掃描儀讀取并在本地緩沖字節(jié)。然后緩沖的字節(jié)將在下一次調(diào)用 Read() 時(shí)返回。直覺(jué)上,這感覺(jué)像是錯(cuò)誤的解決方案,因?yàn)榇a看起來(lái)像是標(biāo)準(zhǔn)庫(kù)中可能已經(jīng)存在的相當(dāng)?shù)图?jí)的解決方案。有沒(méi)有更好的方法,更慣用標(biāo)準(zhǔn)的 go 組件來(lái)做到這一點(diǎn)?
1 回答

月關(guān)寶盒
TA貢獻(xiàn)1772條經(jīng)驗(yàn) 獲得超5個(gè)贊
一個(gè)簡(jiǎn)單的方法是使用io.Pipe.
func ScannerToReader(scanner *bufio.Scanner) io.Reader {
reader, writer := io.Pipe()
go func() {
defer writer.Close()
for scanner.Scan() {
writer.Write(scanner.Bytes())
}
}()
return reader
}
- 1 回答
- 0 關(guān)注
- 124 瀏覽
添加回答
舉報(bào)
0/150
提交
取消