我正在尝试通过chan将[] byte馈送到gob解码器。它可以工作,但首先,解码器会抛出一堆EOF错误,然后停止。当它停止引发错误时,该程序的行为与我期望的完全一样,即解码gobs并正确处理它产生的结构。
这是调用函数,正在读取的通道是SSH通道。
log.Println("Reading channel")
dchan := make(chan []byte, 200)
go decoder(dchan)
for {
buf := make([]byte, 1024)
//log.Println("Waiting for data")
numBytes, err := channel.Read(buf)
if err != nil {
log.Println(err)
continue
}
dchan <- buf[:numBytes]
}
解码器功能如下:
func decoder(dchan chan []byte) error {
gob.Register(datums.Message{})
var message datums.Message
bbuf := bytes.NewBuffer(make([]byte, 512))
dec := gob.NewDecoder(bbuf)
for data := range dchan {
//log.Println("Decoding data")
bbuf.Write(data)
err := dec.Decode(&message)
if err != nil {
log.Println("Error in decoder")
log.Println(err)
continue
}
//log.Println(&message)
}
return nil
}
我不确定这是否是一个真正的问题,gob解码器是从缓冲区中删除数据还是将其留在缓冲区中,直到显示出足够的数据来生成值为止?
答案 0 :(得分:1)
对channel.Read(buf)
的调用可以读取部分内容。尝试对部分料滴进行解码时,解码器将返回错误。
由于channel满足io.Reader接口,因此应用程序可以直接在通道上创建解码器:
gob.Register(datums.Message{})
dec := gob.NewDecoder(channel)
for {
var message datums.Message
err := dec.Decode(&message)
if err != nil {
log.Println("Error in decoder", err)
break
}
log.Println(&message)
}