cgo – 如何将字符串转换为C固定字符数组

我正在尝试在Go代码中实例化一个C结构。 结构是这样定义的(在我无法修改的外部库中):

typedef struct { char field1[256]; } S1 

在去,我做了这个:

 func myfunc(mystr string){ // We need to convert mystr from string to char array cStr := C.CString(mystr) defer C.free(unsafe.Pointer(cStr) // Should work now s1 := &C.S1{field1: cStr} // Do something with s1... } 

但它没有编译,因为:

不能在字段值中使用cStr(类型* C.char)作为类型[256] C.char

我试过强迫([256] C.char)(cStr),但它显然也不起作用。

有没有办法实现我想要做的事情?

最简单的解决方案是将struct的字段定义更改为char-pointer,这对于C中的字符串来说非常标准:

 typedef struct { char *field1; } S1 

更复杂的解决方案是[1]

 arr := [256]C.char{} for i := 0; i < len(mystr) && i < 255; i++ { // leave element 256 at zero arr[i] = C.char(mystr[i]) } s1 := &C.S1{field1: arr} 

[1]代码未经测试,无法在此工作站上编译。

不幸的是,在Go中没有任何方便的方法来处理[size]C.char作为字符串(我想我曾经看过一个提议,但是在某个时候添加了这个…)

在我的代码中而不是直接处理它,我选择在需要的时候手动将字符串写入结构中

 func strCopy(dest *[maxTextExtent]C.char, src []byte) { for i, c := range src { dest[i] = C.char(c) } // This is C, we need to terminate the string! dest[len(src)] = 0 } 

而我以前用来处理它的方式就不那么安全了

 s1 := &C.S1{ field1: *(*[256]C.char)(unsafe.Pointer(cStr)), }