Преобразование указателя C в Go Slice

Я новичок в языке 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.


go c cgo
person Ozan    schedule 24.10.2016    source источник
comment
Обычно предпочтительнее использовать массив, а не полагаться на пакет отражения: см. github.com/golang/go/wiki/cgo#turning-c-arrays-into-go-slices   -  person JimB    schedule 24.10.2016