从C指针转换为Go Slice

时间:2016-10-24 07:50:48

标签: c go cgo

我是Go语言的新手,我有一个问题,关于从C void指针到Go字节切片的转换。

这样有一个C函数cCallback。这会调用导出的Go函数myStreamCallback

int cCallback(const void *inputBuffer, void *outputBuffer, unsigned long frames, const PaStreamCallbackTimeInfo *timeInfo,
    PaStreamCallbackFlags statusFlags, void *userData) {
    PaStreamCallbackResult res;

    goCallback((void*)inputBuffer, outputBuffer, frames, (PaStreamCallbackTimeInfo*)timeInfo, statusFlags, userData, &res);
    /* some stuff */
}

我在Go中导出的myStreamCallback函数是

//export myStreamCallback
func goCallback(inputBuffer, outputBuffer unsafe.Pointer, framesPerBuffer C.ulong, timeInfo *C.PaStreamCallbackTimeInfo,
    statusFlags C.PaStreamCallbackFlags, userData unsafe.Pointer, result *C.PaStreamCallbackResult) C.PaStreamCallbackResult {
    /* some stuff */

    Len := int(framesPerBuffer)
    h := &reflect.SliceHeader{Data: uintptr(inputBuffer), Len: Len, Cap: Len}
    NewSlice := *(*[]byte)(unsafe.Pointer(h)) //conversion to slice

    /* some stuff */
}

我想要做的是将C' inputBuffer转换为名为NewSlice的Go切片。这个解决方案是我在网上找到的,但我不知道它是一种优雅,快速和安全的方式将C&#char字符转换为Go切片还是有其他方法?除此之外,我不知道在创建切片后inputBuffer侧释放C会发生什么。我很高兴如果你帮我理解我是Go的新手。

0 个答案:

没有答案