通过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 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦