gpt4 book ai didi

Gob 解码器抛出 EOF 错误一段时间然后停止

转载 作者:IT王子 更新时间:2023-10-29 02:07:12 28 4
gpt4 key购买 nike

我正在尝试将 []byte 通过 chan 提供给 gob 解码器。它可以工作,但起初解码器会抛出一大堆 EOF 错误,然后停止。当它停止抛出错误时,程序的行为与我预期的完全一样,它解码 gob 并正确处理它生成的结构。

这是调用函数,正在读取的 channel 是 SSH channel 。

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 解码器是从缓冲区中删除数据还是将其保留在那里直到出现足够的数据来生成值?

最佳答案

调用 channel.Read(buf) 可以读取部分 gob。尝试解码部分 gob 时,解码器将返回错误。

因为 channel满足 io.Reader接口(interface),应用程序可以直接在 channel 上创建解码器:

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

关于Gob 解码器抛出 EOF 错误一段时间然后停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55202269/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com