es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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>

Tags:  , , ,

Answer

  1. Avatar for 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:

    package main
    
    import "C"
    import (
        "unsafe"
    )
    
    //export hello
    func hello() *C.uchar {
        goBytes := []byte{1, 2, 3}
        cBytes := (*C.uchar)(C.malloc(C.size_t(len(goBytes))))
        defer C.free(unsafe.Pointer(cBytes))
    
        // copiar los bytes del slice de Go al arreglo de C
        for i, b := range goBytes {
            cBytes[i] = C.uchar(b)
        }
    
        return cBytes
    }
    
    func main() {}
    

    En test.c:

    #include <stdio.h>
    #include "hello.h"                       
    
    int main() {
       unsigned char *c = hello();
       for (int i = 0; i < 3; i++) {
          printf("%u\n", c[i]);
       }
       free(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>

Comments are closed.