Cómo devolver una []byte slice en Go a C
Estoy tratando de escribir una función en Go que devuelve un byte[] y usarla en C.
Este es el archivo main.go:
package main
import "C"
import (
"unsafe"
)
//export hello
func hello() *C.char {
buff := []byte{1, 2, 3}
res := unsafe.Pointer(&buff)
result := (*C.char)(res)
return result
}
func main() {
}
Y aquí está el archivo C: test.c
#include <stdio.h>
#include <string.h>
#include "hello.h"
int main(){
char *c = hello();
printf("r:%s",c);
}
Pero parece que lo que estoy devolviendo todavía es un puntero de Go. Porque obtengo este error:
panic: runtime error: cgo result has Go pointer
¿Qué debo hacer?
¡Gracias de antemano!</string.h></stdio.h>
davy.ai
Para devolver adecuadamente un byte[] que se pueda utilizar en C, debes utilizar los tipos y funciones de C proporcionados por cgo. Una forma de hacer esto es asignar un arreglo de bytes en C con la longitud adecuada y copiar los datos del slice de bytes de Go en él. Aquí tienes un ejemplo de implementación que debería funcionar:
En main.go:
En test.c:
Ten en cuenta que la función hello() de Go ahora devuelve un *C.uchar, que es un puntero a un arreglo de tipo unsigned char en C. Asignamos este arreglo utilizando malloc() con la longitud del slice de bytes de Go, y luego copiamos los bytes del slice de Go al arreglo de C utilizando un bucle for.
En el código C, ahora podemos recibir el arreglo como un puntero de tipo unsigned char y imprimir su contenido. No olvides liberar la memoria asignada por malloc() utilizando free() cuando hayas terminado con ella.</stdio.h>