Prácticas recomendadas de CGO e Interoperabilidad
Aísle cgo detrás de paquetes pequeños y pruebe en todos los destinos.
Busca en todas las páginas de la documentación
Aísle cgo detrás de paquetes pequeños y pruebe en todos los destinos.
Estas reglas mantienen la interop nativa lista para producción: propiedad clara, compilaciones reproducibles y mecanismos de escape cuando se requiere CGO_ENABLED=0.
import "C" a los paquetes de aplicaciones.unsafe, #cgo o archivos .so de proveedor.CGO_ENABLED=1 como con CGO_ENABLED=0 cuando el módulo reclame compilaciones portátiles.staticcheck, govulncheck) y excepciones documentadas en ADRs.import "C" a un paquete interno por dependencia nativa. El código de la aplicación solo depende de tipos y errores de Go.C.*, en los límites del módulo. Los llamadores no deben necesitar conocimiento de cgo para compilar.//go:build !cgo o errores claros cuando cgo sea obligatorio. Las compilaciones de CI y cruzadas deben fallar ruidosamente, no comportarse mal silenciosamente..so, licencias y la matriz de SO/arquitectura compatibles.init que llaman a C. La inicialización diferida en el primer uso simplifica las pruebas y el orden de inicio.C.CString/C.CBytes con C.free en todas las rutas. Use defer inmediatamente después de que la asignación tenga éxito.C.GoString/C.GoBytes a menos que C retenga la propiedad por contrato.//export con mutexes o canales. Asuma que C llama desde hilos arbitrarios del SO.runtime.LockOSThread solo alrededor de la configuración de C local del hilo, no de los manejadores completos. Desbloquee rápidamente para preservar el rendimiento del planificador.runtime.cgocall antes de micro-optimizar el código Go.//export. Los pánicos no capturados al cruzar el límite FFI abortan el proceso.CGO_CFLAGS, CGO_LDFLAGS y pkg-config para las imágenes de CI. Las compilaciones reproducibles superan a las rutas exclusivas del portátil.scratch necesitan variantes puras de Go o planes musl estáticos.go test ./... con cgo activado y desactivado cuando sea aplicable. Detectar etiquetas de compilación faltantes temprano.golang.org/x/sys y los puertos puros antes de nuevo cgo. Experiencia de consumidor más simple y superficie de ataque más pequeña.import "C" con !wasm.A menudo, un directorio por SDK de proveedor con tipos de Go que reflejan las 10-20 llamadas que realmente usa.
Elimine los encabezados C no utilizados del bloque de comentarios para acelerar las compilaciones.
No, mantenga C.* interno.
Las API públicas utilizan slices, cadenas y structs de Go.
Metapaquete de la cadena de herramientas C, pkg-config, encabezados de desarrollo de proveedor, matriz para valores de CGO_ENABLED y pruebas nativas para la propiedad de punteros.
Verifique la seguridad de los hilos, la recuperación de pánicos, las liberaciones de asignaciones y si C mantiene punteros después del retorno.
Requiera pruebas que invoquen devoluciones de llamada desde múltiples hilos cuando C lo permita.
Cuando el módulo documenta explícitamente cgo como requerido y todos los consumidores están de acuerdo.
Las bibliotecas de código abierto deberían esforzarse más para ofrecer rutas puras de Go.
Las prácticas asumen que ya eligió cgo en proceso.
Use la guía de decisiones primero cuando la estrategia aún esté abierta.
Sí, cuando el upstream lo permita: fije hashes y documente las matrices de plataforma en las rutas ${SRCDIR}.
Verifique que las licencias permitan la redistribución.
Aumento del recuento de hilos del SO, runtime.cgocall en perfiles de CPU, crecimiento de RSS por fugas de heap de C y latencia de cola bajo carga.
Diríjalos a las páginas de Fundamentos y Seguridad FFI; restrinja las primeras tareas a capas puras de Go por encima del envoltorio.
Los cambios de C pasan por revisores que leen C.
Habilite staticcheck y govet; C en sí mismo necesita clang-tidy/ASan por separado.
Fije la versión de golangci-lint por manifiesto en la compilación.
Versiones de pila: Esta página fue escrita para Go 1.26.x (predeterminado Green Tea GC, go fix modernizers - verifique el parche en la compilación), chi (última versión - verifique en la compilación), gin (última versión - verifique en la compilación), echo (última versión - verifique en la compilación), google.golang.org/grpc (última versión - verifique en la compilación), sigs.k8s.io/controller-runtime (última versión - verifique en la compilación), kubebuilder (última versión - verifique en la compilación), tinygo (última versión - verifique los objetivos de la placa en la compilación), wazero (última versión - verifique en la compilación) y golangci-lint (última versión - verifique el conjunto de linters en la compilación).
Revisado por Chris St. John·Última actualización: 18 jul 2026