为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 bytes.Buffer 流中处理 io.EOF?

如何在 bytes.Buffer 流中处理 io.EOF?

Go
莫回无 2022-01-17 10:57:10
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]))

    }

}


查看完整回答
反对 回复 2022-01-17
  • 1 回答
  • 0 关注
  • 155 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信