通过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
}
网友评论