У меня есть byte.Buffer, в который я упаковываю данные с помощью функции binary.Write(). Затем мне нужно отправить этот массив байтов в функцию C. Используя Go 1.6, мне не удалось это понять.
buf := new(bytes.Buffer) //create my buffer
....
binary.Write(buf, binary.LittleEndian, data) //write my data to buffer here
addr := (*C.uchar)(unsafe.Pointer(&buf.Bytes()[0])) //convert buffers byte array to a C array
rc := C.the_function(addr, C.int(buf.Len())) //Fails here
Он терпит неудачу в строке, вызывающей функцию C, говорящую:
panic: runtime error: cgo argument has Go pointer to Go pointer
Функция С:
int the_function(const void *data, int nbytes);
Мне удалось заставить работать следующее, но было неправильно преобразовать массив байтов в строку. Есть лучший способ сделать это? Рискнет ли этот метод побочными эффектами для данных?
addr := unsafe.Pointer(C.CString(string(buf.Bytes()[0]))
Опять же, это должно работать в Go 1.6, в котором введены более строгие правила указателя cgo.
Спасибо.