为了账号安全,请及时绑定邮箱和手机立即绑定

如何在Go中序列化固定长度数据结构的切片

如何在Go中序列化固定长度数据结构的切片

Go
犯罪嫌疑人X 2022-10-17 10:18:48
以下代码会产生恐慌: binary.Write: invalid type main.test:type (    config struct {        Key uint16        Val uint16    }    test struct {        Mode uint32        Data []config    })func main() {    t := test{        Mode: 5,        Data: []config{            {1, 2},            {3, 4},        },    }    var bs bytes.Buffer    assert(binary.Write(&bs, binary.LittleEndian, t))}关键点是:数据结构的长度config是固定的,但该test结构包含一个 的切片config,其数量是可变的。我需要与其他用 C 编写的程序进行交互,所以不能使用诸如 GOB 之类的东西。除了手动进行之外,还有什么方法可以对这种数据结构进行二进制编码?
查看完整描述

1 回答

?
慕工程0101907

TA贡献1887条经验 获得超5个赞

问题不是写出切片,因为切片是受支持的。引自binary.Write()

Write 将数据的二进制表示写入 w。数据必须是固定大小的值或固定大小的切片,或指向此类数据的指针。

问题是大小config不固定。它不固定,因为它包含一个切片类型的字段,并且切片的二进制表示不固定(取决于它的长度)。

因此支持写入切片值,由于上述原因,不支持写入包含切片的复合类型(例如结构)的值。

您可以将字段更改为数组类型(例如[2]config),但我认为这对您来说还不够。

您可以使用单独编写字段,在这种情况下,您可以编写切片值。encoding/binary

例如:

var bs bytes.Buffer

fmt.Println(binary.Write(&bs, binary.LittleEndian, t.Mode))

fmt.Println(binary.Write(&bs, binary.LittleEndian, t.Data))

这将输出(在Go Playground上尝试):


<nil>

<nil>

曾有提议扩展encoding/binary以支持类似案例(请参阅此处),但被拒绝了。encoding/binary是为了简单的事情。

如果您需要更大的灵活性,请使用encoding/gob(尽管特定于 Go)或使用encoding/json(所有语言都支持)。


查看完整回答
反对 回复 2022-10-17
  • 1 回答
  • 0 关注
  • 105 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信