golang:打包一个结构
golang: pack a struct
请考虑这个示例代码:
package main
//#include <stdio.h>
//#include <stdint.h>
//#pragma pack(push, 1)
//struct Packed_Struct {
// uint16_t A;
// uint16_t B;
// uint32_t C;
// uint16_t D;
//};
//#pragma pack(pop)
//
//struct UnPacked_Struct {
// uint16_t A;
// uint16_t B;
// uint32_t C;
// uint16_t D;
//};
//
//
//void print_C_struct_size(){
// struct Packed_Struct Packed_Struct;
// struct UnPacked_Struct UnPacked_Struct;
// printf("Sizeof Packed_Struct: %lu\n", sizeof(Packed_Struct) );
// printf("Sizeof UnPacked_Struct: %lu\n", sizeof(UnPacked_Struct) );
// return;
//}
//
import "C"
import(
"fmt"
"unsafe"
)
type GoStruct struct{
A uint16
B uint16
C uint32
D uint16
}
func main(){
fmt.Println("Hello world!")
meh := C.print_C_struct_size()
var GoStruct GoStruct
fmt.Printf("Sizeof GoStruct : %d\n", unsafe.Sizeof(GoStruct) )
fmt.Printf("meh type: %T\n", meh)
}
输出为:
$ go run cgo.go
Hello world!
Sizeof Packed_Struct: 10
Sizeof UnPacked_Struct: 12
Sizeof GoStruct : 12
meh type: main._Ctype_void
请注意,打包后的结构占用 10 个字节,否则占用 12 个字节。默认情况下,我在 Go 中的尝试似乎占用 12 个字节,如此处所示。
是否有 Go-ish 方法来打包此结构,使其仅使用 10 个字节?
因此,根据 https://github.com/golang/go/wiki/cgo#struct-alignment-issues:
Go 不支持打包结构(例如,最大对齐为 1 字节的结构),您不能在 Go 中使用打包的 C 结构。即使你的程序通过了编译,它也不会如你所愿。要使用它,你必须 read/write 结构作为字节 array/slice。
从 "what" 我明白了,我整理了这个:https://play.golang.org/p/OmdMVDMikSn。
本质上,设置结构体,binary.Write
它变成一个字节切片,切片显示10个字节。
请考虑这个示例代码:
package main
//#include <stdio.h>
//#include <stdint.h>
//#pragma pack(push, 1)
//struct Packed_Struct {
// uint16_t A;
// uint16_t B;
// uint32_t C;
// uint16_t D;
//};
//#pragma pack(pop)
//
//struct UnPacked_Struct {
// uint16_t A;
// uint16_t B;
// uint32_t C;
// uint16_t D;
//};
//
//
//void print_C_struct_size(){
// struct Packed_Struct Packed_Struct;
// struct UnPacked_Struct UnPacked_Struct;
// printf("Sizeof Packed_Struct: %lu\n", sizeof(Packed_Struct) );
// printf("Sizeof UnPacked_Struct: %lu\n", sizeof(UnPacked_Struct) );
// return;
//}
//
import "C"
import(
"fmt"
"unsafe"
)
type GoStruct struct{
A uint16
B uint16
C uint32
D uint16
}
func main(){
fmt.Println("Hello world!")
meh := C.print_C_struct_size()
var GoStruct GoStruct
fmt.Printf("Sizeof GoStruct : %d\n", unsafe.Sizeof(GoStruct) )
fmt.Printf("meh type: %T\n", meh)
}
输出为:
$ go run cgo.go
Hello world!
Sizeof Packed_Struct: 10
Sizeof UnPacked_Struct: 12
Sizeof GoStruct : 12
meh type: main._Ctype_void
请注意,打包后的结构占用 10 个字节,否则占用 12 个字节。默认情况下,我在 Go 中的尝试似乎占用 12 个字节,如此处所示。
是否有 Go-ish 方法来打包此结构,使其仅使用 10 个字节?
因此,根据 https://github.com/golang/go/wiki/cgo#struct-alignment-issues:
Go 不支持打包结构(例如,最大对齐为 1 字节的结构),您不能在 Go 中使用打包的 C 结构。即使你的程序通过了编译,它也不会如你所愿。要使用它,你必须 read/write 结构作为字节 array/slice。
从 "what" 我明白了,我整理了这个:https://play.golang.org/p/OmdMVDMikSn。
本质上,设置结构体,binary.Write
它变成一个字节切片,切片显示10个字节。