我正在制作一个go程序,需要在其中将gob写入文件。我使用.String()方法将gob转换为字符串。

var network bytes.Buffer
encoder := gob.NewEncoder(&network)

_ = encoder.Encode(valueToEncode)

gobString := network.String()

然后将gob写入文件,稍后再检索它并将其发送到此程序:
var filebytes = []byte(file)  //i think that these two lines are the issue
network := bytes.NewBuffer(filebytes)

decoder := gob.NewDecoder(network)

var decoded interface{}

_ := decoder.Decode(&decoded)

但是当我运行它时,它给了我这个错误:



我认为问题出在解码器程序的前两行。那么我应该怎样正确解码镜头呢?

编辑:
我想要的是gobString的.UnString()方法。我该如何实现?

最佳答案

encoding/gob 从Go值生成二进制数据。结果不是用于文本表示,因此您不应将其视为string,而应视为一系列字节,例如[]byte

也就是说,如果必须获取编码数据,请不要使用 Buffer.String() ,而应使用 Buffer.Bytes()

这是一个使用string编码和解码encoding/gob值的示例:

// ENCODE
var network bytes.Buffer
encoder := gob.NewEncoder(&network)

valueToEncode := "Hello, 世界"
if err := encoder.Encode(valueToEncode); err != nil {
    panic(err)
}

gobData := network.Bytes() // Save / serialize this byte slice

// DECODE
network2 := bytes.NewBuffer(gobData)
decoder := gob.NewDecoder(network2)

var decoded string
if err := decoder.Decode(&decoded); err != nil {
    panic(err)
}
fmt.PrintTln(decoded)

输出(在Go Playground上尝试):
Hello, 世界

还要注意,如果您打算将编码后的数据写入网络连接或文件中,则不需要bytes.Buffer,您可以直接对其进行编码。如果必须使用bytes.Buffer,则还可以使用其 Buffer.WriteTo() 方法将其内容写入 io.Writer (例如文件或网络连接)。

关于go - Golang将gob字符串转换为接口(interface),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/61640382/

10-14 16:30