Как преобразовать структуру Go в структуру C?

#go #hash #struct #cgo

#Вперед #хэш #структура #cgo

Вопрос:

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

 struct hash {
    uint8_t bytes[32];
};
  

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

 type Hash [32]bytes
  

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

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

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

Ответ №1:

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

 Chash := *(*C.struct_hash)(unsafe.Pointer(amp;hash))
  

Ответ №2:

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