Gob декодер выдает ошибку EOF на некоторое время, затем останавливается - PullRequest
1 голос
/ 17 марта 2019

Я пытаюсь передать [] байт через канал в декодер. Это работает, но сначала декодер генерирует целую кучу ошибок EOF, а затем останавливается. Когда программа перестает выдавать ошибки, программа ведет себя точно так же, как и следовало ожидать, декодируя гобы и обрабатывая структуры, которые она выдает правильно.

Это вызывающая функция, канал, с которого выполняется чтение, является каналом 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 Ответ

1 голос
/ 17 марта 2019

При вызове channel.Read(buf) можно прочитать частичный гоб. Декодер вернет ошибку при попытке декодирования частичного гоба.

Поскольку канал удовлетворяет интерфейсу 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)
}
...