一尘不染

cgo-如何将字符串转换为C固定的char数组

go

我正在尝试在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),但显然也不起作用。

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


阅读 708

收藏
2020-07-02

共1个答案

一尘不染

最简单的解决方案是将结构的字段定义更改为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]未经测试的代码,无法在此工作站上编译。

2020-07-02