如何将结构作为二进制数据写入golang中的文件?

six*_*ter 3 file go

以下 C 代码的 golang 等价物是什么?

fwrite(&E, sizeof(struct emp), n, f);
Run Code Online (Sandbox Code Playgroud)

我尝试使用

[]byte(i)
Run Code Online (Sandbox Code Playgroud)

转换它,但这似乎行不通。

小智 8

您可以使用“编码/二进制”包:

import "encoding/binary"

func dump() {
    f, err := os.Create("file.bin")
    if err != nil {
        log.Fatal("Couldn't open file")
    }
    defer f.Close()

    var data = struct {
        n1 uint16
        n2 uint8
        n3 uint8
    }{1200, 2, 4}
    err = binary.Write(f, binary.LittleEndian, data)
    if err != nil {
        log.Fatal("Write failed")
    }
}
Run Code Online (Sandbox Code Playgroud)


Not*_*fer 5

您不应该这样做,只需使用支持自动序列化和反序列化的序列化格式即可。Go 的标准库支持:

Gob:结构体的二进制编码。当您对与其他语言的交流不感兴趣时​​推荐使用。https://golang.org/pkg/encoding/gob/

JSON:好吧,你知道...如果你需要与其他语言交换序列化数据。https://golang.org/pkg/encoding/json/

XML:如果你觉得复古。

当然 protobuf 是另一个要考虑的选择,如果您想与其他语言进行类型安全的交换,而 json 不支持。 https://github.com/golang/protobuf

  • 在某些情况下,您需要处理二进制数据,并且兼容性/标准/字节顺序不是问题。如果 OP 不知道 Gob/JSON/XML 以及最初的需求可以用这些来满足,这个答案可能是一个很好的贡献,但对于需要二进制来获得所需吞吐量的场景来说绝不是有效的或性能。在这种情况下,提出 JSON/XML 是完全错误的。 (3认同)
  • 如果您正在编写二进制文件,则应该 100% 序列化为二进制文件。二进制格式,呃,已经存在于世界中,你知道,它们可以通过结构来建模。 (3认同)