bufio.NewScanner(r)从r调用Scan()排放缓冲区

时间:2018-07-09 03:35:47

标签: go io

我想从同一阅读器r创建2个扫描仪。但是,当从第一个扫描程序调用{​​{1}}时,它会从Scan()释放缓冲区,因此第二个扫描程序正在读取零缓冲区。这是常见的行为吗?如何解决该问题,以便第二台扫描仪正确读取原始的r

r

这里是play golang

的示例

这就是我要执行的操作:从文件中读取特定行,但是当第二次调用该函数时,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: 耗尽了。

r

1 个答案:

答案 0 :(得分:0)

阅读读者通常是一种破坏性的行为。尤其是http请求正文。

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

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())

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