[英]cgo - How to convert string to C fixed char array
我正在嘗試在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)),
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.