Я пытаюсь передать [] байт через канал в декодер. Это работает, но сначала декодер генерирует целую кучу ошибок 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 данные из буфера или оставляет его там, пока не появится достаточно данных для генерации значения?