Голанг: упаковать структуру - PullRequest
1 голос
/ 15 апреля 2019

Пожалуйста, рассмотрите этот пример кода:

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 байтов?

1 Ответ

0 голосов
/ 15 апреля 2019

Итак, за https://github.com/golang/go/wiki/cgo#struct-alignment-issues:

Go не поддерживает упакованную структуру (например, структуры, где максимальное выравнивание составляет 1 байт), вы не можете использовать упакованную структуру C в Go. Даже если ваша программа пройдет компиляцию, она не будет делать то, что вы хотите. Чтобы использовать это, вы должны прочитать / записать структуру как байтовый массив / срез .

Из "что" я понял, я собрал это: https://play.golang.org/p/OmdMVDMikSn.

По сути, настройте структуру и binary.Write превратите ее в байтовый фрагмент, в этом слайсе будет показано 10 байтов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...