Я пытаюсь вызвать функцию C из Go с помощью cgo, чтобы прочитать сообщение об ошибке. Функция создает сообщение с неизвестной длиной менее 256 байт.Как читать строку из функции C в Go?
Рабочий пример в C:
char message[ERROR_SIZE]; //256
last_error(message, sizeof(message));
printf("message: %s\n", message);
Моя попытка в Go (не работает):
var ptr *C.char
C.last_error(ptr, ERROR_SIZE)
var message = C.GoString(ptr)
fmt.Printf("message: %s\n", message)
Когда код идти запускается, сообщение пуст. Должна ли версия go to prealocate space для сообщения? Как это сделать?
Обновление после комментария LP для передачи массива. Это работает, но кажется немного неудобным:
var buf [ERROR_SIZE]byte
var ptr = (*C.char)(unsafe.Pointer(&buf[0]))
C.last_error(ptr, len(buf))
var message = C.GoString(ptr)
fmt.Printf("message: %s\n", message)
Есть ли более простой способ?
Не эксперт [тег: go], но функция [tag: c] принимает массив. На стороне [tag: go] вы пропустите простой указатель. – LPs
Спасибо за ваш комментарий @LPs, объявление массива и передача указателя на первый элемент (функция фактически принимает char *). Сообщение напечатано. – Mark
'C.GoString' выделяет пространство по мере необходимости, и оно должно работать в этом случае всякий раз, когда у вас есть строка с нулевым завершением. Если строка не завершена нулем или может содержать нулевые символы, просто рассматривайте ее как байты и используйте 'C.GoBytes'. – JimB