如何将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_hashHash之间的所有内容的大小和类型相同。

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

考虑对齐在c 你不能简单地做演员。 最好的方法应该是从c指定值1或去c。 但是这个过程很痛苦的是结构很大并且struct包含struct