通过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
随时随地看视频