Go como pegamento: Integración con Python, C y otros lenguajes

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Por qué Go no es una isla, sino un puente

\n\n

Go 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.

\n

Y 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.

\n\n

Integración de Go con C a través de cgo: el clásico

\n\n

El 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.

\n\n

Escribiendo nuestro primer programa con cgo

\n\n

Escribamos un ejemplo simple: llamaremos a printf estándar de C. Crea un archivo main.go:

\n\n
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\n

Ejecutamos: go run main.go. Si tienes GCC instalado (o MinGW en Windows), todo se compilará. Verás «¡Hola desde C, Gopher!». ¡Magia!

\n\n

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.

\n\n

Paso de tipos complejos: estructuras

\n\n

A 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\n
package 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\n

Observa: 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\n

Cuándo no usar cgo

\n

No 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
\n\n

Integración de Go con Python: scriptea con inteligencia

\n\n

Python 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\n

Método 1: Llamar a Python mediante os/exec (simple y fiable)

\n\n

La forma más segura para educación es ejecutar un script de Python como un proceso separado

Blogs

Book Recommendations