
Por que aprendi Go depois de anos em Python
Em 2022 comecei a aprender Go. Não porque Python estava ruim — porque queria entender por que sistemas de alta escala são escritos em Go, e a única forma era escrever.
Em 2022 comecei a aprender Go.
Não porque Python estava ruim. Python resolveu muito do que eu precisava nos anos anteriores. Mas eu estava olhando para ferramentas de infraestrutura que usava — kubectl, Terraform, Docker, a maioria das ferramentas cloud-native — e percebendo que eram escritas em Go.
Não era coincidência. Queria entender por quê.
O primeiro impacto: Go é uma linguagem diferente de Python de formas não óbvias.
Não é só tipagem estática. É que Go toma decisões de design que parecem restrições no começo e que revelam sua razão de ser com o tempo.
Sem herança. Sem generics até 2022. Sem exception (tem error como valor). Goroutines em vez de threads. Compilação para binário único.
A sensação inicial foi de "por que essa linguagem é tão opinionada?"
O erro de tipos que aprendi mais na primeira semana não foi de compilação — foi de zero value.
Em Python, None é None. Em Go, todo tipo tem um zero value: int começa em 0, string começa em "", bool começa em false, struct começa com todos os campos no zero value.
type Lead struct {
Name string
Email string
Score int
}
var lead Lead // {Name: "", Email: "", Score: 0}
Isso significa que você não tem NullPointerException em structs — mas também significa que Score: 0 pode ser "score não definido" ou "score realmente é zero", e você precisa pensar sobre isso.
O que ficou depois de meses:
Error handling explícito — em Python, exceção propaga até onde alguém capturar. Em Go:
result, err := processLead(lead)
if err != nil {
return fmt.Errorf("failed to process lead %s: %w", lead.Email, err)
}
Você não pode "esquecer" de tratar erro — ele está na assinatura da função. Parece verboso no começo. Depois de um incidente causado por exception silenciosa em Python, você aprecia.
Goroutines — concorrência simples de escrever:
go func() {
syncToExternalCRM(lead)
}()
Não threads, não async/await, não callbacks. go antes da função. O runtime gerencia.
Compilação em binário — go build produz um binário que roda em qualquer máquina Linux sem instalar Go, sem instalar dependências. Docker image de Go pode ser FROM scratch + o binário. Minúsculo.
Hoje Go é minha linguagem principal. Não porque Python seja ruim — para scripting, data analysis, ML, Python é melhor. Mas para serviços que precisam de performance, concorrência, e binário portável, Go é minha escolha.
A melhor forma de aprender linguagem nova é escrever algo real nela. Não hello world — algo que você faria na linguagem que você já sabe, mas agora em Go. O atrito de "como eu faria isso nessa linguagem?" é onde o aprendizado acontece.