2016-09-30 2 views
0

Я хочу использовать cgo. На стороне C у меня есть структура, содержащая 32 байта.Как преобразовать Go struct в C struct?

struct hash { 
    uint8_t bytes[32]; 
}; 

По размеру у меня очень похожий тип.

type Hash [32]bytes 

Я хотел бы вызвать функцию C void f(struct hash) с экземпляром Hash типа. Если возможно, я также хотел бы избежать копирования значения.

Chash C.struct_hash := hash Простое присваивание не работает:

не может использовать хэш (тип Hash) в качестве типа C.struct_hash в присвоении

ответ

2

Вы можете использовать unsafe пакет отбрасывать данные. Компилятор Go больше не может проверять типы здесь, поэтому вам нужно убедиться, что размер и тип всего идентичны между C.struct_hash и Hash.

Chash := *(*C.struct_hash)(unsafe.Pointer(&hash)) 
0

считают выравнивать в с вы не можете просто сделать бросок. лучшим способом должно быть присвоение значения 1 на 1 из c для перехода или перехода на c. Но этот процесс является болезненным, поскольку структура является большой и struct содержит структуру

Смежные вопросы