Por que Go não é uma ilha, mas uma ponte
\n\nGo é uma linguagem notável. É rápida, compilada, com uma excelente biblioteca padrão. Mas sejamos honestos: no mundo real, raramente escrevemos tudo do zero em uma única linguagem. Você tem uma biblioteca antiga e testada pelo tempo em C que seria uma pena reescrever. Ou um script legal em Python para aprendizado de máquina. Ou você quer executar lógica em Go diretamente no navegador.
\nE então surge a pergunta: como integrar Go com outras linguagens? Não se preocupe, Go foi projetado especificamente para ser um bom "vizinho". Neste artigo na PythonLib, vamos abordar três maneiras principais de integrar seu programa Go com código de outras linguagens. Você aprenderá como funciona o cgo, como chamar funções Python através de chamadas de sistema e até mesmo como compilar Go para WebAssembly.
Integração Go com C via cgo: o clássico
\n\nO caminho mais direto e poderoso é o cgo. Não é uma biblioteca, mas um mecanismo embutido do Go que permite que seu código chame funções C diretamente. Como funciona? Você simplesmente escreve o import "C" e antes dele — um comentário com código em C. O compilador Go une tudo.
Escrevendo o primeiro programa com cgo
\n\nVamos escrever um exemplo simples: chamar o printf padrão do C. Crie um arquivo main.go:
package main\n\n/*\n#include <stdio.h>\n#include <stdlib.h>\n\nvoid hello_cgo(const char* name) {\n printf("Olá do 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\nExecute: go run main.go. Se você tiver o GCC instalado (ou MinGW no Windows), tudo será compilado. Você verá «Olá do C, Gopher!». Mágica!
Importante: C.CString aloca memória no heap do C, portanto, somos obrigados a liberá-la através de C.free. Caso contrário — vazamento. O Cgo exige disciplina de você.
Passando tipos complexos: estruturas
\n\nFrequentemente, precisamos trabalhar não com strings, mas com estruturas. Suponha que temos uma biblioteca C para trabalhar com matrizes. Queremos passar uma estrutura Go para ela. Vamos fazer isso:
\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 recebeu: Point{X:%d, Y:%d, Result:%d}\\n", goPoint.X, goPoint.Y, goPoint.Result)\n}\n\n\nObserve: convertemos explicitamente os tipos C para tipos Go. O Cgo não consegue mapear estruturas automaticamente, portanto, você é sempre responsável pela conversão. Este é um dos principais compromissos da integração Go com a linguagem C.
\n\nQuando o cgo não é necessário
\nNão use cgo se:
\n- \n
- Você só precisa chamar um comando no terminal — use
os/exec. \n - Você está escrevendo código multiplataforma — cgo complica a compilação. \n
- O desempenho não é crítico — cgo adiciona sobrecarga na troca de contexto. \n
Integração Go com Python: scriptando com inteligência
\n\nPython e Go são um ótimo par. Go pela velocidade e paralelismo, Python pela flexibilidade e ecossistema (NumPy, TensorFlow). Como integrá-los? Temos duas abordagens: a "pesada" (via cgo e Python C API) e a "leve" (via subprocessos).
\n\nMétodo 1: Chamar Python via os/exec (simples e confiável)
\n\nA maneira mais segura para educação é executar um script Python como um processo separado