Muitas tarefas que antes exigiam cgo agora têm caminhos pure-Go: golang.org/x/sys para syscalls, portas comunitárias de bibliotecas de criptografia e compressão, e pacotes da biblioteca padrão que encapsulam APIs do SO diretamente.
Escolher pure Go primeiro mantém a compilação cruzada, binários estáticos e CI mais simples.
Liste as entradas do diretório com x/sys no Unix em vez de libc encapsulada por cgo.
package mainimport ( "fmt" "os" "golang.org/x/sys/unix")func main() { dir, err := os.Open(".") if err != nil { panic(err) } defer dir.Close() // Prefira os.ReadDir no código da aplicação; unix.ReadDirent mostra o formato de x/sys buf := make([]byte, 4096) for { n, err := unix.ReadDirent(int(dir.Fd()), buf) if err != nil || n == 0 { break } // Analise buf por unix.ParseDirent em helpers de produção fmt.Printf("lido %d bytes de dados de dirent\n", n) }}
O que isso demonstra:
Descritores de arquivo de os.File alimentam syscalls unix sem cgo.
golang.org/x/sys rastreia diferenças de plataforma por GOOS.
O código da aplicação geralmente deve preferir APIs os de nível superior; x/sys é para lacunas.
Pacotes de syscall pure-Go usam stubs de assembly ou intrínsecos do compilador gerados por plataforma para invocar a interface de trap do kernel.
Nenhum compilador C é necessário; go build com CGO_ENABLED=0 ainda é bem-sucedido.
golang.org/x/sys é o local mantido para constantes e funções de baixo nível; o pacote syscall da biblioteca padrão está congelado para compatibilidade.
Portas comunitárias (SQLite pure Go, imagem, criptografia) reimplementam algoritmos em Go ou usam //go:embed para tabelas de dados em vez de vincular C.
Usar o pacote syscall depreciado para novo código - Perde correções em x/sys. Correção: Importe golang.org/x/sys/unix ou windows e migre os pontos de chamada.
Assumir que pure-Go significa mais lento - Portas modernas frequentemente igualam cgo para trabalho vinculado a I/O; criptografia vinculada à CPU pode diferir. Correção: Faça benchmark na sua carga de trabalho antes de escolher.
Escolher mattn/go-sqlite3 em CI estático - Requer cgo e cuidado com musl/glibc. Correção: Use modernc.org/sqlite quando CGO_ENABLED=0 for inegociável.
Reimplementar ioctl adivinhando layouts de struct - Quebra entre versões de kernel. Correção: Siga as definições de x/sys ou a documentação oficial do SO; adicione tags de build por arquitetura.
Ignorar tags de build em recursos opcionais de cgo - Consumidores não conseguem compilar sem uma ferramenta de compilação C. Correção: Forneça implementações !cgo ou documentação clara sobre o requisito de cgo obrigatório.
RPC para evitar cgo quando o orçamento de latência é de microssegundos - O custo da rede ofusca a dor de construção economizada. Correção: Meça ponta a ponta antes de rejeitar cgo no processo.
Versões de Stack: Esta página foi escrita para Go 1.26.x (GC padrão Green Tea, modernizadores go fix - verifique o patch na compilação), chi (última - verifique na compilação), gin (última - verifique na compilação), echo (última - verifique na compilação), google.golang.org/grpc (última - verifique na compilação), sigs.k8s.io/controller-runtime (última - verifique na compilação), kubebuilder (última - verifique na compilação), tinygo (última - verifique os alvos de placa na compilação), wazero (última - verifique na compilação) e golangci-lint (última - verifique o conjunto de linters na compilação).
Revisado por Chris St. John·Última atualização: 18 de jul. de 2026