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

以下代码会产生恐慌: 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))

}


关键点是:

  1. 数据结构的长度config是固定的,但该test结构包含一个 的切片config,其数量是可变的。

  2. 我需要与其他用 C 编写的程序进行交互,所以不能使用诸如 GOB 之类的东西。

除了手动进行之外,还有什么方法可以对这种数据结构进行二进制编码?


犯罪嫌疑人X
浏览 106回答 1
1回答

慕工程0101907

问题不是写出切片,因为切片是受支持的。引自binary.Write():Write 将数据的二进制表示写入 w。数据必须是固定大小的值或固定大小的切片,或指向此类数据的指针。问题是大小config不固定。它不固定,因为它包含一个切片类型的字段,并且切片的二进制表示不固定(取决于它的长度)。因此支持写入切片值,由于上述原因,不支持写入包含切片的复合类型(例如结构)的值。您可以将字段更改为数组类型(例如[2]config),但我认为这对您来说还不够。您可以使用单独编写字段,在这种情况下,您可以编写切片值。encoding/binary例如:var bs bytes.Bufferfmt.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(所有语言都支持)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go