- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我想为我使用 bufio.NewScanner
和 Scan()
的实用函数编写测试。我通常在 stdout
上使用它,现在我想模拟一小段流,我可以在其中返回一些静态字符串以进行测试。
bufio.NewScanner(r io.Reader)
需要一个 Reader
但它只需要一个 read
方法。通过阅读源代码,我无法弄清楚它从哪个缓冲区读取或者它是如何传入的。
我怎样才能以简洁明了的方式模拟它?
最佳答案
要简单地测试您的代码,您可以使用@Sven 的回答。
要了解用于测试的简单 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
接口(interface)。因此,它将被 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
方法以根据您的要求获得自定义行为。
关于testing - 模拟 bufio.NewScanner 的标准输出流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38563583/
我有这个代码: var scanner = bufio.NewScanner(os.Stdin) func readInt() int { scanner.Scan() ans, _
我有以下代码片段 package main import ( "os/exec" "bufio" "fmt" ) func main() { cmd := exec.Command("
我想为我使用 bufio.NewScanner 和 Scan() 的实用函数编写测试。我通常在 stdout 上使用它,现在我想模拟一小段流,我可以在其中返回一些静态字符串以进行测试。 bufio.N
我尝试使用 bufio.NewScanner 使用以下函数逐行读取文件。 func TailFromStart(fd *os.File, wg *sync.WaitGroup) { fd.S
我想从同一个阅读器 r 创建 2 个扫描仪。但是,当从第一个扫描器调用 Scan() 时,它会耗尽 r 的缓冲区,因此第二个扫描器正在读取零缓冲区。这是一种常见的行为吗?如何修复它以便第二个扫描仪正确
我是一名优秀的程序员,十分优秀!