Warning: Undefined array key "HTTP_ACCEPT_LANGUAGE" in /srv/vhost/diaridigital.net/home/html/sourcecode/includes/config.php on line 61

Deprecated: substr(): Passing null to parameter #1 ($string) of type string is deprecated in /srv/vhost/diaridigital.net/home/html/sourcecode/includes/config.php on line 61
Llamadas a C desde Go
Source Code

Warning: Undefined array key "typ" in /srv/vhost/diaridigital.net/home/html/sourcecode/main/articles.php on line 18

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"

Warning: Undefined array key "typ" in /srv/vhost/diaridigital.net/home/html/sourcecode/includes/navigation.inc.php on line 10

Warning: Undefined array key "typ" in /srv/vhost/diaridigital.net/home/html/sourcecode/includes/navigation.inc.php on line 21
Xavier es un desarrollador senior full stack y opera desde la ciudad mediterránea de Barcelona. Le encantan las tecnologías de software y está convencido que el desarrollo de software es un proceso colaborativo y abierto.
Y es un apasionado de la astronomía y de la fotografía. Lo puedes encontrar en:
Comparte este post


Warning: Undefined array key "typ" in /srv/vhost/diaridigital.net/home/html/sourcecode/includes/footer.inc.php on line 24