記一次使用chan []byte踩的坑

通過(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
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容