我有一个如下定义的结构:
type MyStruct struct {
A [10]byte
B uint64
C uint16
}
并使用binary.Read,如下所示
err = binary.Read(r, binary.BigEndian, &mystruct) // mystruct is Mystruct type
我为mystruct
中的所有字段获取了正确的值。从Reader r
读取的一些以下代码都可以获得正确的结果。
但aligncheck
侧MyStruct
的大小可能是24,但目前是32.但对于二进制字节读取,它应该占用20个字节。
所以我不确定我是否能够获得正确的结果,或者go工具链的某些部分会将结构打包到合适的大小?
答案 0 :(得分:3)
正如Tim Cooper在评论中所述,您正在比较相同数据的两种不同表示。 aligncheck
告诉您结构实例占用的内存(堆/堆栈)占用了多少空间,受结构字段对齐和填充的影响,原因为explained at length elsewhere。
binary.Read
和.Write
并未尝试将对象存储在具有边界对齐的内存中;他们只是写了一连串的连续字节。因此,无论字段的顺序如何,它们都将输出相同大小的结构,并且它将始终是结构的最小大小(因为没有添加填充)。
答案 1 :(得分:1)
重新访问二进制文件的源代码后,它获取结构的每个字段的实际长度,然后从r
阅读器读取正确的数据量,并分别将值分配给每个字段。因此,结构在内存中的对齐方式并不重要。