Práticas Recomendadas de CGO e Interoperabilidade
Isole o cgo por trás de pequenos pacotes e teste em todos os alvos.
Busque em todas as páginas da documentação
Isole o cgo por trás de pequenos pacotes e teste em todos os alvos.
Estas regras mantêm a interop nativa distribuível: propriedade clara, builds reproduzíveis e 'escape hatches' quando CGO_ENABLED=0 é necessário.
import "C" a pacotes de aplicação.unsafe, #cgo ou arquivos .so de fornecedores.CGO_ENABLED=1 quanto com CGO_ENABLED=0 quando o módulo reivindicar builds portáteis.staticcheck, govulncheck) e exceções documentadas em ADRs.import "C" a um pacote interno por dependência nativa. O código da aplicação depende apenas de tipos e erros Go.C.*, nos limites do módulo. Os chamadores não devem precisar de conhecimento de cgo para compilar.//go:build !cgo ou erros claros quando o cgo for obrigatório. CI e cross-compiles devem falhar ruidosamente, não se comportar mal silenciosamente..so, licenças e matriz de SO/arquitetura suportados.init que chamam C. A inicialização preguiçosa no primeiro uso simplifica testes e ordem de inicialização.C.CString/C.CBytes com C.free em todos os caminhos. Usar defer imediatamente após a alocação ter sucesso.C.GoString/C.GoBytes, a menos que C retenha a propriedade por contrato.//export com mutexes ou canais. Assumir que C chama de threads de SO arbitrárias.runtime.LockOSThread apenas em torno da configuração de thread local C, não em manipuladores inteiros. Desbloquear prontamente para preservar a taxa de transferência do scheduler.runtime.cgocall antes de micro-otimizar o código Go.//export. Panics não capturados através da fronteira FFI abortam o processo.CGO_CFLAGS, CGO_LDFLAGS e pkg-config para imagens de CI. Builds reproduzíveis superam caminhos exclusivos de laptop.go test ./... com cgo ligado e desligado quando aplicável. Capturar tags de build ausentes precocemente.golang.org/x/sys e portas puras antes de novo cgo. Experiência do consumidor mais simples e menor superfície de ataque.import "C" com !wasm.Frequentemente um diretório por SDK de fornecedor com tipos Go espelhando as 10-20 chamadas que você realmente usa.
Exclua cabeçalhos C não utilizados do bloco de comentários para acelerar os builds.
Não - mantenha C.* interno.
APIs públicas usam slices, strings e structs Go.
Metapacote de toolchain C, pkg-config, cabeçalhos de desenvolvimento de fornecedor, matriz para valores CGO_ENABLED e testes nativos para propriedade de ponteiro.
Verifique a segurança de thread, recuperação de panics, liberações de alocação e se C detém ponteiros após o retorno.
Exija testes que invoquem callbacks de vários threads quando C permitir.
Quando o módulo documenta explicitamente cgo como necessário e todos os consumidores concordam.
Bibliotecas de código aberto devem se esforçar mais para oferecer caminhos puros Go.
As práticas assumem que você já escolheu cgo in-process.
Use o guia de decisão primeiro quando a estratégia ainda estiver aberta.
Sim, quando o upstream permitir - fixe hashes e documente fatias de plataforma em caminhos ${SRCDIR}.
Verifique se as licenças permitem a redistribuição.
Aumento da contagem de threads de SO, runtime.cgocall em perfis de CPU, crescimento de RSS de vazamentos de heap C e latência de cauda sob carga.
Aponte-os para as páginas de Noções Básicas e Segurança FFI; restrinja as primeiras tarefas a camadas puras Go acima do wrapper.
Mudanças em C passam por revisores que leem C.
Habilite staticcheck e govet; o próprio C requer clang-tidy/ASan separado.
Fixe a versão do golangci-lint por manifesto na build.
Versões de Stack: Esta página foi escrita para Go 1.26.x (padrão Green Tea GC, go fix modernizers - verifique o patch na build), chi (última - verifique na build), gin (última - verifique na build), echo (última - verifique na build), google.golang.org/grpc (última - verifique na build), sigs.k8s.io/controller-runtime (última - verifique na build), kubebuilder (última - verifique na build), tinygo (última - verifique alvos de placa na build), wazero (última - verifique na build) e golangci-lint (última - verifique o conjunto de linters na build).
Revisado por Chris St. John·Última atualização: 18 de jul. de 2026