Я новичок в языке 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 */
}
Моя экспортированная функция myStreamCallback
в Go:
//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 */
}
Что я хочу сделать, так это преобразовать inputBuffer
C в фрагмент Go, который называется NewSlice
. Это решение, которое я нашел в Интернете, но я не знаю, является ли это элегантным, быстрым и безопасным способом преобразования массива символов C в фрагмент Go или есть другие методы? Кроме того, я не знаю, что произойдет, если inputBuffer
будет освобождено в C
стороне после создания слайса. Я буду рад, если вы поможете мне разобраться, учитывая, что я новичок в Go.