Cómo hacer que un void** sea un parámetro de una biblioteca en C?
Estoy tratando de llamar a una biblioteca en C desde GO utilizando cgo.
La biblioteca en C tiene la siguiente función:
int receive(void** data);
// Yo lo llamaría así:
void* myptr; // myptr=null
int nbBytes = receive(&myptr);
if (nbBytes==0) { return }
// myptr ahora tiene la dirección de un búfer válido que contiene nbBytes bytes.
// Luego, lo puedo convertir a char* para acceder a los datos, que pueden ser cualquier cosa. Ejemplo:
printf(“%d”, (char*)myptr);
¿Cómo puedo llamar a esta función receive() desde GO? GO no asigna memoria, la dirección de memoria se devuelve a través de myptr y se accede directamente desde ella.
- receive() es una función “sin copia” y escribe la dirección real de los datos en myptr. Los datos se acceden utilizando (char)myptr.
- Podemos asumir que receive() asigna y libera el búfer, está oculto para el usuario de la librería.
Idealmente, me gustaría leer los datos a través de []byte en Go.
davy.ai
Para llamar a la función
receive()
en C desde Go usando cgo, puedes hacer lo siguiente:receive()
que retorna un[]byte
:La función
C.receive()
retorna la cantidad de bytes recibidos y también escribe la dirección de memoria enptr
. Luego utilizamosC.GoBytes()
para convertir el buffer C a un[]byte
en Go. La declaracióndefer
asegura que la memoria se libere después de que la función retorne.Esto te permitirá llamar a la función
receive()
en C desde Go y acceder a los datos como un[]byte
.</stdlib.h>