#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. Но этот процесс является болезненным, так как структура большая, а структура содержит структуру