Golang将gob字符串转换为接口

4

我正在编写一个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)

但是当我运行这个程序时,它会给出以下错误:

gob: 编码的无符号整数超出范围

我认为问题出在解码程序的前两行。那么我应该放什么来正确解码gob呢?

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


将一个使用gob编码的string值解码为interface{}时会产生另一个错误:本地接口类型*interface {}只能从远程接口类型解码;接收到的具体类型为string,因此请提供一个[mcve]以产生您的错误。 - icza
我提供的代码对我来说会抛出无符号整数超出范围的错误。 - user13484461
您发布的代码不完整,单独运行会导致编译时错误。还有其他部分您没有展示出来。我尝试将其简化为最小运行示例,但仍然出现了上述错误。因此,请提供一个 [mcve] 来重现您的错误,以便我们能够帮助您解决实际问题。 - icza
1个回答

2
encoding/gob 会将Go值生成二进制数据,结果不是用于文本表示的,因此您不应该将其视为string,而应视为一系列字节,例如 []byte
话虽如此,如果必须获取编码数据,请勿使用Buffer.String(),而应使用Buffer.Bytes()
下面是使用encoding/gobstring值进行编码和解码的示例:
// 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(例如文件或网络连接)中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接