手记

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

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

0人推荐
随时随地看视频
慕课网APP