gpt4 book ai didi

go - bufio.NewScanner(r) 从 r 调用 Scan() 排出缓冲区

转载 作者:数据小太阳 更新时间:2023-10-29 03:22:31 27 4
gpt4 key购买 nike

我想从同一个阅读器 r 创建 2 个扫描仪。但是,当从第一个扫描器调用 Scan() 时,它会耗尽 r 的缓冲区,因此第二个扫描器正在读取零缓冲区。这是一种常见的行为吗?如何修复它以便第二个扫描仪正确读取原始 r

r := bytes.NewReader([]byte("ninebytes"))
fmt.Println(r.Len()) // 9
sc1 := bufio.NewScanner(r)
sc1.Scan()
fmt.Printf("scanner1: %s\n", sc1.Text()) // scanner1: ninebytes

// i want create new scanner from r too
fmt.Println(r.Len()) // 0
sc2 := bufio.NewScanner(r)
sc1.Scan()
fmt.Printf("scanner2: %s\n", sc2.Text()) // scanner2:

这是一个例子 play golang

这就是我想要做的:从文件中读取特定行,但是当第二次调用该函数时,r 被耗尽。

func readLineScanner(r io.Reader, lineNum int) ([]byte, error) {
sc := bufio.NewScanner(r)
lastLine := 0
for sc.Scan() {
lastLine++
if lastLine == lineNum {
break
}
}
return sc.Bytes(), sc.Err()
}

最佳答案

阅读读者通常是一种破坏性行为;特别是对于 http 请求主体。

相反,您可以创建一个 tee 阅读器,它以 unix tee 命令为模型。

Link to the docs

修改您给出的示例:

r := bytes.NewReader([]byte("ninebytes"))

var buf bytes.Buffer
tee := io.TeeReader(r, &buf)

sc1 := bufio.NewScanner(tee)
sc1.Scan()
fmt.Printf("scanner1: %s\n", sc1.Text())

sc2 := bufio.NewScanner(&buf)
sc2.Scan()
fmt.Printf("scanner2: %s\n", sc2.Text())

使用 tee 阅读器,当您从 r 读取时,它会将这些字节的副本写入 buf,您可以在第二个扫描器中再次使用它。

关于go - bufio.NewScanner(r) 从 r 调用 Scan() 排出缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51237913/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com