如何将Go结构转换为C结构?
问题描述:
我想使用cgo。在C端我有包含32个字节的结构。如何将Go结构转换为C结构?
struct hash {
uint8_t bytes[32];
};
在围棋大小我有非常相似的类型。
type Hash [32]bytes
我想调用C函数void f(struct hash)
与Hash
类型的实例。如果可能的话,我也想避免一个值的副本。
简单赋值Chash C.struct_hash := hash
不起作用:
不能使用哈希(散列类型)类型C.struct_hash在分配
答
可以使用unsafe
包铸数据。 Go编译器不能再检查这里的类型,因此您需要确保C.struct_hash
和Hash
之间的所有内容的大小和类型相同。
Chash := *(*C.struct_hash)(unsafe.Pointer(&hash))
答
考虑对齐在c 你不能简单地做演员。 最好的方法应该是从c指定值1或去c。 但是这个过程很痛苦的是结构很大并且struct包含struct