https://play.golang.org/p/JKXKa7Pvjd我试图弄清楚如何使用 bytes.Buffer 在流中可以有随机 io.EOF 的情况下测试我的后台函数?例子:package mainimport ( "fmt" "io" "bytes" "time")func main() { buffer := new(bytes.Buffer) go background(buffer) i := 0 for i < 5 { i++ fmt.Fprintf(buffer, "%d)teststring\n", i) time.Sleep(1 * time.Second) // generates a io.EOF } time.Sleep(1 * time.Second)}func background(r io.Reader) { buf := make([]byte, 64) for { n, err := r.Read(buf) if err != nil { fmt.Print(err.Error()) return // removing `return` will result in race condition } fmt.Print(string(buf[:n])) }}我正在寻找的结果是:1)teststring2)teststring3)teststring4)teststring5)teststring如何使用time.Sleep(1 * time.Second)模拟延迟来实现这一点?
1 回答
慕运维8079593
TA贡献1876条经验 获得超5个赞
您确定要使用 bytes.Buffer 吗?它不是流,也不是线程安全的,这就是你得到竞争条件的原因。使用io.Pipe()。
https://play.golang.org/p/c0fLEI350w
package main
import (
"fmt"
"io"
"time"
)
func main() {
pr, pw := io.Pipe()
go background(pr)
i := 0
for i < 5 {
i++
fmt.Fprintf(pw, "%d)teststring\n", i)
time.Sleep(1 * time.Second)
}
time.Sleep(1 * time.Second)
}
func background(r io.Reader) {
buf := make([]byte, 64)
for {
n, err := r.Read(buf)
if err != nil {
fmt.Print(err.Error())
//return
}
fmt.Print(string(buf[:n]))
}
}
- 1 回答
- 0 关注
- 155 浏览
添加回答
举报
0/150
提交
取消