一个标准输出流,我想写的,我用bufio.NewScanner
和Scan()
效用函数的测试。我通常在stdout
上使用它,现在我想模拟一小段流,以便为测试目的返回一些静态字符串。模拟为bufio.NewScanner
bufio.NewScanner(r io.Reader)
需要Reader
但只需要一个read
方法。通过阅读源代码,我无法弄清楚从缓存读取或如何在被传递。
我怎么能嘲笑,在一个简短的方式吗?
一个标准输出流,我想写的,我用bufio.NewScanner
和Scan()
效用函数的测试。我通常在stdout
上使用它,现在我想模拟一小段流,以便为测试目的返回一些静态字符串。模拟为bufio.NewScanner
bufio.NewScanner(r io.Reader)
需要Reader
但只需要一个read
方法。通过阅读源代码,我无法弄清楚从缓存读取或如何在被传递。
我怎么能嘲笑,在一个简短的方式吗?
要简单地测试你的代码,你可以使用@斯文的答案。
要得到一个简单的io.Reader
用于测试的想法,考虑下面的例子:
type R struct {
Data string
done bool
}
func (r *R) Read(p []byte) (n int, err error) {
copy(p, []byte(r.Data))
if r.done {
return 0, io.EOF
}
r.done = true
return len([]byte(r.Data)), nil
}
R
是可以被具有Read
方法实现的io.Reader
接口的自定义测试类型。因此,它将被NewScanner
接受。它可以用作:
func NewR(data string) *R {
return &R{data, false}
}
r := NewR("Test\nmessage\n")
scanner := bufio.NewScanner(r)
for scanner.Scan() {
fmt.Printf("Line: %s\n", scanner.Text())
}
输出:
Line: Test
Line: message
两种类型R
及其Read
方法已被定义为字节的一个简单的源工作。 Scan
调用它的读者(输入NewScanner
)Read
方法,直到它得到一个EOF
或错误。为简单起见,R
的Read
方法复制其数据到在其第一呼叫呼叫者的缓冲液(p
),并返回的任何后续呼叫的EOF
。
请注意,在\n
处的行的实际分割由scanner.Scan
而不是r.Read
完成。
您可以修改上面的Read
方法来获得定制的行为按您的要求。
感谢您的详细解释,这使得现在有很多意义! – Mahoni
您可以使用bytes.Buffer
,因为它实现了io.Reader
功能。
例https://play.golang.org/p/gjjMmT3SzD:
package main
import (
"bufio"
"bytes"
"fmt"
)
func main() {
buf := bytes.NewBufferString("foo\nbar")
scanner := bufio.NewScanner(buf)
for scanner.Scan() {
fmt.Println(scanner.Text())
}
}
你说的对'stdout'使用'bufio.NewScanner'是什么意思?你在用'stdout'创建一个新的扫描器吗? – abhink
@abhink是'bufio.NewScanner(os.Stdout)' – Mahoni