Llamadas a C desde Go
Tiempo de lectura: 1 minutos
Ejecutar código en C desde un programa en Go para extender la funcionalidad de Go
C desde Go
Es posible incluir, de forma directa, código escrito en C. Es realmente simple y solo se necesita incluir el código e indicar que se importe a Go.
Lo primero es definir el import para cargar el paquete "C"
A continuación, ponemos el código en C, tal cual, en un comentario justo por encima de la sentencia import
package main
// #include <stdio.h>
//
// void hello() {
//
// printf("Codigo escrito en C");
// }
import "C" Acabamos el código en Go con una función main que llame a la función en C:
func main() {
// llamada al código en C
C.hello()
} Y ejecutamos
C:\Users\xpena\repository\golang\cgo>go run cgo
Codigo escrito en C Ahora podemos pasar la función en C a un archivo y sustituirlo por un include
package main
// #include "hello.h"
import "C"
func main() {
// llamada al código en C
C.hello()
} Donde hello.h es todo el código en C
#include <stdio.h>
void hello() {
printf("Código en C");
}
Parámetros
Ahora con parámetros. Primero definimos el parámetro de entrada en el código en C
#include <stdio.h>
#include "chello.h"
void hello(char* text) {
printf("Código en C; recibido: %s", text);
} Y definimos la cabecera correspondiente para definir la función en C
#include <stdio.h>
void hello(char*); Convertir el parámetro
Si hacemos la llamada a C.hello("texto") no va a funcionar porque en realidad estamos pasando un tipo string de Go a un puntero en C. Lo que necesitamos es un «cast» para convertirlo y que se reserve la memoria correctamente. Usamos la conversión de C.String.
La nueva función main en Go queda así:
func main() {
// llamada al código en C, con parámetro
text := C.CString("Hello, World!")
C.hello(text)
} Ahora ejecutamos de nuevo
C:\Users\xpena\repository\golang\cgo>go run cgo
Código en C; recibido: Hello, World! Bibliotecas
Finalmente, podemos utilizar bibliotecas que ya están compiladas. Lo que necesitamos es especificarle al linker que queremos enlazar las bibliotecas. para ello utilizamos las etiquetas LDFLAGS en la sentencia especial #cgo
package mpg123
/*
#cgo LDFLAGS: -lmpg123
#include "mpg123.h"
*/
import "C"