在 Go 中编写打包二进制文件的惯用方法是什么,它会产生与此 Python 相同的输出?

What is the idiomatic way to write a packed binary file in Go that would produce the same output as this Python?

我正在尝试找出 如何 在 Go 中编写二进制文件的最佳方法,该文件对应于以下 Python:

import struct
f = open('tst.bin', 'wb')
fmt = 'iih'
f.write(struct.pack(fmt,4, 185765, 1020))
f.close()

我一直在修改我在 Github.com 和其他一些资源中看到的一些示例 ,但我似乎无法让任何东西正常工作 . 在 Go 中做这种事情的惯用方法是什么?

下面是我现在是如何完成的(Golang):

package main
import (
        "fmt"
        "os"
        "encoding/binary"
        )


func main() {
        fp, err := os.Create("tst.bin")

        if err != nil {
                panic(err)
        }

        defer fp.Close()

        aBuf := make([]byte, 4)
        bBuf := make([]byte, 4)
        cBuf := make([]byte, 2)

        binary.LittleEndian.PutUint32(aBuf, 4)
        binary.LittleEndian.PutUint32(bBuf, 185765)
        binary.LittleEndian.PutUint16(cBuf, 1020)

        binary.Write(fp, binary.LittleEndian, aBuf)
        binary.Write(fp, binary.LittleEndian, bBuf)
        binary.Write(fp, binary.LittleEndian, cBuf)
}

已验证Python:

import numpy as np

data = np.fromfile('tst.bin', dtype='i4,i4,i2')

print(data)

正如我在问题中提到的,我不确定这是执行此操作的惯用方法,但经过相当多的修改后,这确实解决了我遇到的问题。发布这样至少有一个答案以防其他人来看:

package main
import (
        "fmt"
        "os"
        "encoding/binary"
        )


func main() {
        fp, err := os.Create("tst.bin")

        if err != nil {
                panic(err)
        }

        defer fp.Close()

        aBuf := make([]byte, 4)
        bBuf := make([]byte, 4)
        cBuf := make([]byte, 2)

        binary.LittleEndian.PutUint32(aBuf, 4)
        binary.LittleEndian.PutUint32(bBuf, 185765)
        binary.LittleEndian.PutUint16(cBuf, 1020)

        binary.Write(fp, binary.LittleEndian, aBuf)
        binary.Write(fp, binary.LittleEndian, bBuf)
        binary.Write(fp, binary.LittleEndian, cBuf)
}

稍微清理一下,让它更简短我会做这样的事情:

func main() {
        fp, err := os.Create("tst.bin")

        if err != nil {
                panic(err)
        }

        defer fp.Close()

        lineBuf := make([]byte, 10) //sized large enough to hold my two 4 byte ints and one 2 byte int

        binary.LittleEndian.PutUint32(lineBuf[0:4], 4) //packing into 4 bytes
        binary.LittleEndian.PutUint32(lineBuf[4:8], 185765) 
        binary.LittleEndian.PutUint16(lineBuf[8:10], 1020) //packing into 2 bytes

        binary.Write(fp, binary.LittleEndian, lineBuf)
}

经过更多的修改和对另一个问题的一些反馈后,我能够想出这个(看起来更清晰但会 post 在测试生成一些大文件后对性能的反馈):

package main
import (
        "os"
        "encoding/binary"
        )

type binData struct {
    A int32
    B int32
    C int16
}

func main() {
        fp, err := os.Create("tst.bin")

        if err != nil {
                panic(err)
        }

        defer fp.Close()
        bd := binData{A:4, B:185765, C:1020}

        binary.Write(fp, binary.LittleEndian, &bd)
}