继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

记一次使用chan []byte踩的坑

PIPIONE
关注TA
已关注
手记 921
粉丝 147
获赞 701

通过ChannelInputStream生产数据,返回chan []byte,Consumer消费数据,但是出现 Consumer接收的数据不完整重复的现象,经排查是因为slice惹的祸。代码和注释如下

func Consumer(writer io.Writer){
     channelInputStream := ChannelInputStream(reader)     for p := range channelInputStream {
            _, err = writer.Write(p)            if err != nil {
                panic(err)
            }
      }
}func ChannelInputStream(reader io.Reader) chan []byte {
    out := make(chan []byte, 1024)    go func() {
        buffReader := bufio.NewReader(reader)        //buff := make([]byte, 1024) 错误的做法
        for {
            buff := make([]byte, 1024) //一定要在这里实例化
            rn, err := buffReader.Read(buff)            if err != nil {                if err == io.EOF {
                    close(out)                    break
                } else {
                    panic(err)
                }
            }
            out <- buff[:rn] 
          //如果在for循环外面make buff,每次写入channel的slice都是指向同一个数组,
          //如果buff的值变了,会导致写入的slice映射的数组的值发生变化,
          //这样消费者range得到的数据是混乱的被覆盖的
        }
    }()    return out
}



作者:WinddddRunner
链接:https://www.jianshu.com/p/409cc0c7affc

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP