以下代码会产生恐慌: 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
(所有语言都支持)。
- 1 回答
- 0 关注
- 105 浏览
添加回答
举报
0/150
提交
取消