Por qué Go no es una isla, sino un puente
\n\nGo es un lenguaje maravilloso. Es rápido, compilado, con una excelente biblioteca estándar. Pero seamos honestos: en el mundo real rara vez escribimos todo desde cero en un solo lenguaje. Tienes una biblioteca antigua y probada en C que da pena reescribir. O un script genial en Python para aprendizaje automático. O quieres ejecutar lógica de Go directamente en el navegador.
\nY entonces surge la pregunta: ¿cómo integrar Go con otros lenguajes? No temas, Go fue diseñado específicamente para ser un buen «vecino». En este artículo en PythonLib analizaremos tres formas principales de hacer que tu programa Go se lleve bien con código de otros lenguajes. Aprenderás cómo funciona cgo, cómo llamar funciones de Python a través de llamadas al sistema e incluso cómo compilar Go a WebAssembly.
Integración de Go con C a través de cgo: el clásico
\n\nEl camino más directo y potente es cgo. No es una biblioteca, sino un mecanismo integrado de Go que permite que tu código llame directamente a funciones de C. ¿Cómo funciona? Simplemente escribes el import "C" y antes de él, un comentario con código en C. El compilador de Go lo unirá todo.
Escribiendo nuestro primer programa con cgo
\n\nEscribamos un ejemplo simple: llamaremos a printf estándar de C. Crea un archivo main.go:
package main\n\n/*\n#include <stdio.h>\n#include <stdlib.h>\n\nvoid hello_cgo(const char* name) {\n printf("¡Hola desde C, %s!\\n", name);\n}\n*/\nimport "C"\nimport "unsafe"\n\nfunc main() {\n name := C.CString("Gopher")\n defer C.free(unsafe.Pointer(name))\n C.hello_cgo(name)\n}\n\n\nEjecutamos: go run main.go. Si tienes GCC instalado (o MinGW en Windows), todo se compilará. Verás «¡Hola desde C, Gopher!». ¡Magia!
Importante: C.CString asigna memoria en el heap de C, por lo que debemos liberarla con C.free. De lo contrario, habrá una fuga de memoria. Cgo requiere disciplina de tu parte.
Paso de tipos complejos: estructuras
\n\nA menudo es necesario trabajar no con cadenas, sino con estructuras. Supongamos que tenemos una biblioteca en C para trabajar con matrices. Queremos pasarle una estructura de Go. Hagámoslo:
\n\npackage main\n\n/*\ntypedef struct {\n int x;\n int y;\n int result;\n} Point;\n\nPoint add_points(Point a, Point b) {\n Point r;\n r.x = a.x + b.x;\n r.y = a.y + b.y;\n r.result = r.x + r.y;\n return r;\n}\n*/\nimport "C"\nimport "fmt"\n\ntype GoPoint struct {\n X, Y, Result int\n}\n\nfunc main() {\n a := C.Point{x: 10, y: 20}\n b := C.Point{x: 30, y: 40}\n r := C.add_points(a, b)\n\n goPoint := GoPoint{\n X: int(r.x),\n Y: int(r.y),\n Result: int(r.result),\n }\n fmt.Printf("Go recibió: Point{X:%d, Y:%d, Result:%d}\\n", goPoint.X, goPoint.Y, goPoint.Result)\n}\n\n\nObserva: convertimos explícitamente los tipos de C a tipos de Go. Cgo no puede mapear estructuras automáticamente, por lo que siempre eres responsable de la conversión. Este es uno de los principales compromisos de la integración de Go con el lenguaje C.
\n\nCuándo no usar cgo
\nNo uses cgo si:
\n- \n
- Solo necesitas ejecutar un comando en la terminal — usa
os/exec. \n - Estás escribiendo código multiplataforma — cgo complica la compilación. \n
- El rendimiento no es crítico — cgo añade sobrecarga por el cambio de contexto. \n
Integración de Go con Python: scriptea con inteligencia
\n\nPython y Go son una excelente pareja. Go por la velocidad y el paralelismo, Python por la flexibilidad y el ecosistema (NumPy, TensorFlow). ¿Cómo hacer que se lleven bien? Tenemos dos enfoques: el «pesado» (a través de cgo y la API C de Python) y el «ligero» (a través de subprocesos).
\n\nMétodo 1: Llamar a Python mediante os/exec (simple y fiable)
\n\nLa forma más segura para educación es ejecutar un script de Python como un proceso separado