通過(guò)ChannelInputStream生產(chǎn)數(shù)據(jù),返回chan []byte,Consumer消費(fèi)數(shù)據(jù),但是出現(xiàn) Consumer接收的數(shù)據(jù)不完整重復(fù)的現(xiàn)象,經(jīng)排查是因?yàn)閟lice惹的禍。代碼和注釋如下
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) 錯(cuò)誤的做法
for {
buff := make([]byte, 1024) //一定要在這里實(shí)例化
rn, err := buffReader.Read(buff)
if err != nil {
if err == io.EOF {
close(out)
break
} else {
panic(err)
}
}
out <- buff[:rn]
//如果在for循環(huán)外面make buff,每次寫入channel的slice都是指向同一個(gè)數(shù)組,
//如果buff的值變了,會(huì)導(dǎo)致寫入的slice映射的數(shù)組的值發(fā)生變化,
//這樣消費(fèi)者range得到的數(shù)據(jù)是混亂的被覆蓋的
}
}()
return out
}