Есть некоторые объекты C, такие как объединения, структуры, содержащие битовые поля, и структуры, выравнивание которых отличается от ABI Go, к которым нельзя получить доступ из Go. Некоторые из этих структур нельзя изменить, чтобы они были доступны из кода Go, поскольку они являются частью API существующей библиотеки.
Таким образом, чтобы упорядочить такие объекты в структуры Go, мы не можем использовать код Go. Вместо этого мы должны написать код маршалинга на C. Это прекрасно работает, но я не нашел подходящего способа определить функции C, которые работают с типами, определенными в коде Go. Прямо сейчас я определяю типы данных, которые я упорядочиваю на стороне C, и использую эти типы данных в своем коде Go.
Это действительно неприятно, если я хочу выставить упорядоченные типы как API в моем коде Go, поскольку я не могу выставить тип C как часть интерфейса моего пакета. Мой текущий подход включает переупорядочение уже упорядоченного объекта в тип, определенный в коде Go.
Есть ли более элегантный способ сделать то, что я хочу, то есть сортировать структуры C, к которым нельзя получить доступ из кода Go, в типы данных, определенные в коде Go?
Как и просили в разделе комментариев, вот коллекция объектов C, к которым нельзя получить доступ из Go.
#include <complex.h>
#include <stdbool.h>
union foo {
int i;
float f;
};
struct bar {
bool x:1;
unsigned int y:3;
unsigned int z:4;
};
struct baz {
float f;
complex float c;
};
#pragma pack 1
struct quux {
char c;
short s;
int i;
};