Golang 将 gob 字符串转换为接口(interface)

标签 go decoding gob

我正在制作一个 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: encoded unsigned integer out of range

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

编辑: 我想要的是 gobString 的 .UnString() 方法。我怎样才能做到这一点?

最佳答案

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

就是说,不要使用 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 的方法(例如文件或网络连接)。

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

相关文章:

go - 是否有必要进行早期边界检查以保证 Golang 中写入的安全性?

c - 使用 Microsoft Media Foundation 从非文件源解码音频

encoding - 如何在 Go 中持久化或编码链接数据结构?

sockets - 在 Go 中写入客户端 UDP 套接字

go - 编码/gob 是确定性的吗?

go - 如何使用 golang id3-go 库获取和打印 mp3 Popularimeter 框架

golang 强制对特定 ip 的 http 请求(类似于 curl --resolve)

javascript - 解码 base64 字符串在 JS 中不起作用,适用于 Linux 的 base64

php - 适用于php的UTF-8解码

go - 该程序在后台监听连接并等待用户输入