Gob解码器暂时抛出EOF错误然后停止

时间:2019-03-16 22:49:03

标签: go concurrency buffer gob

我正在尝试通过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解码器是从缓冲区中删除数据还是将其留在缓冲区中,直到显示出足够的数据来生成值为止?

1 个答案:

答案 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)
}