加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何将Go数组的字符串转换为C字符串数组?

发布时间:2020-12-16 03:43:45 所属栏目:百科 来源:网络整理
导读:我在一个项目中使用cgo,我想导出一个函数供使用.这是我想要实现的一个例子: package csplitimport ( "C" "strings")//export Split/* The Split function takes two C strings,the second of which represents a substring to split on,and returns an arra
我在一个项目中使用cgo,我想导出一个函数供使用.这是我想要实现的一个例子:
package csplit

import (
    "C"
    "strings"
)

//export Split
/* The Split function takes two C strings,the second of which represents
   a substring to split on,and returns an array of strings. Example:
       Split("1,2",",") // gives ["1","2"]
*/
func Split(original *C.char,split *C.char) []*C.char {
        goResult := strings.Split(C.GoString(original),C.GoString(split))
        cResult := make([]*C.char,len(goResult))

        for idx,substring := range goResult {
                cResult[idx] = C.CString(substring)
        }

        return cResult
}

问题是返回类型是Go分配数据,而不是移入C堆.这有点恐慌:运行时错误:cgo结果有Go指针

解决方法

您将返回在Go中分配的Go切片,并且是与C数组不同的结构.你需要在C中分配一个数组:
//export Split
func Split(original *C.char,split *C.char) **C.char {
    goResult := strings.Split(C.GoString(original),C.GoString(split))
    cArray := C.malloc(C.size_t(len(goResult)) * C.size_t(unsafe.Sizeof(uintptr(0))))

    // convert the C array to a Go Array so we can index it
    a := (*[1<<30 - 1]*C.char)(cArray)

    for idx,substring := range goResult {
        a[idx] = C.CString(substring)
    }

    return (**C.char)(cArray)
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读