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

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

标签:
Go

通过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

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消