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