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

发布于 2018-04-25 作者 超级苦工 431次 浏览 版块 分享

通过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
}
收藏
暂无回复