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