Skip to main content


Compilação e distribuição​


Uma das características do Go é que ele permite compilar o código em um binário executável, que pode ser distribuído e executado sem precisar instalar o Go no computador de destino. Isso é bem fiferente de linguagens como Python (que normalmente precisamos de um interpretador para executar o programa), o Go compila o código para instruções que podem ser executadas pelo sistema operacional.


Isso facilita a distribuição de ferramentas CLI, servidores e outras aplicações, porque podemos entregar diretamente o arquivo executável.



Compilando com go build​


O comando go build é responsável por compilar nosso código Go, gerando um binário executável quando estamos trabalhando com um programa do package main:

// main.go

package main

import "fmt"

func main() {
// Mostra uma mensagem no terminal.
fmt.Println("Olá, Go!")
}

Para compilar esse código, podemos executar de dentro da pasta do projeto o comando abaixo:

go build

O Go compila o programa e gera um arquivo executável, por padrão, o nome será baseado no nome do diretório do projeto, nesse caso, projeto no Linux e macOS ou projeto.exe no Windows.


Também podemos definir o nome do binário usando -o:

go build -o programa .

Isso gera um executável chamado programa no Linux e macOS. No Windows, podemos informar o nome com a extensão .exe.


Para executar no Linux:

./programa


Compilando para Linux, Windows e macOS​


Por padrão, o go build compila o programa para o sistema operacional e a arquitetura do computador onde estamos usando no momento da compilação. Por exemplo, se estivermos usando Linux em um processador x86-64, o Go normalmente gerará um binário para Linux nessa arquitetura.


Porém, também podemos compilar o mesmo código para outros sistemas operacionais, sem precisar executar o Go diretamente nesses sistemas. Esse processo é conhecido como cross-compilation, ou compilação cruzada. Para isso, o Go oferece duas variáveis de ambiente, GOOS e GOARCH.


Cross-compilation com GOOS e GOARCH​


O GOOS define o sistema operacional para o qual o programa será compilado, enquanto que o GOARCH define a arquitetura do processador que executará o binário, exemplo:

GOOS=linux      Sistema operacional Linux
GOOS=windows Sistema operacional Windows
GOOS=darwin Sistema operacional macOS

GOARCH=amd64 Processadores x86-64
GOARCH=arm64 Processadores ARM de 64 bits

Podemos verificar os valores atuais com:

go env GOOS GOARCH

Para compilar nosso programa para diferentes sistemas, podemos executar os seguintes comandos em um terminal Linux ou macOS.

# Compilando para Linux (x86-64):
GOOS=linux GOARCH=amd64 go build -o programa-linux .

# Compilando para Windows (x86-64):
GOOS=windows GOARCH=amd64 go build -o programa.exe .

# Compilando para macOS (ARM64):
GOOS=darwin GOARCH=arm64 go build -o programa-macos .

Depois da compilação, teremos três arquivos executáveis:

projeto/
│
├── go.mod
├── main.go
│
├── programa-linux
├── programa.exe
└── programa-macos


Cuidados com a compilação cruzada​


Embora o Go facilite a compilação para diferentes sistemas, isso não significa que qualquer programa poderá ser compilado e executado em todos eles sem alterações. Por exemplo, um programa que depende de recursos específicos do Linux pode não funcionar no Windows. Também podemos encontrar limitações quando usamos cgo, que permite integrar código Go com bibliotecas escritas em C. Nesse caso, a compilação cruzada pode exigir ferramentas adicionais, como um compilador C compatível com o sistema de destino.


Para programas escritos apenas em Go, sem dependências nativas, a compilação cruzada normalmente é mais simples. Outro cuidado é que compilar para outro sistema não significa conseguir executar o binário no sistema atual. Se compilarmos um programa para Windows enquanto estamos no Linux, normalmente precisaremos de um ambiente Windows para executar o programa compilado e testar ele.


Por isso, mesmo que a compilação termine sem erros, é recomendado testar o programa no sistema operacional para o qual ele foi compilado.