我是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的新手。