Introdução: por que código limpo em Go não é luxo, mas necessidade
\n\nGo (ou Golang) é uma linguagem que à primeira vista parece simples e até chata. Não tem genéricos (até a versão 1.18), não tem classes, não tem máquina virtual. Mas é justamente esse minimalismo que o torna um campo de batalha ideal para código limpo. Se você escreve em Go e seu projeto começa a parecer um espaguete de goroutine e switch ilegíveis — você está perdendo a principal vantagem da linguagem: velocidade de desenvolvimento e facilidade de manutenção.
Neste artigo, vamos analisar 7 regras práticas que ajudarão você a escrever código Go idiomático, que será compreensível não apenas para o compilador, mas também para seus colegas (e para você mesmo daqui a um mês). Vamos lá!
\n\n1. Nomes de variáveis corretos: curto e claro
\n\nEm Go, é comum usar nomes curtos, mas significativos. Ao contrário do Java, onde ListOfUserOrders é normal, em Go você verá orders ou até os. Por quê? Porque Go é uma linguagem para ler código, não para escrevê-lo.
Regras básicas de nomenclatura em Go
\n- \n
- Variáveis locais: 1-2 letras para coisas óbvias (
i— contador,s— string). \n - Pacotes: uma palavra, letras minúsculas, sem sublinhados (
http,fmt). \n - Identificadores exportados: começam com letra maiúscula (
GetUser). \n - Acrônimos: escritos no mesmo registro (
HTTP,URL, e nãoHttpouUrl). \n
// Ruim\nfunc GetUserDataFromDatabaseByID(userID string) (UserData, error) {\n var userDataFromDb UserData\n // ...\n return userDataFromDb, nil\n}\n\n// Bom\nfunc GetUser(id string) (User, error) {\n var u User\n // ...\n return u, nil\n}\n\nDica: se o nome de uma variável tem mais de 2 palavras — provavelmente você está complicando algo.
\n\n2. Formatação: confie no gofmt
\n\nEm Go não há "guerras de estilo". O comando gofmt decide tudo por você. Isso não é uma recomendação — é um padrão. Se você não usa gofmt — você não está escrevendo em Go, mas em um "dialeto do Go".
O que o gofmt faz?
\n- \n
- Define indentação (tabulação, não espaços). \n
- Remove quebras de linha desnecessárias. \n
- Alinha comentários. \n
- Remove imports não utilizados (com a flag
-s). \n
// Antes do gofmt\nfunc add (a int,b int) int{\nreturn a+b\n}\n\n// Depois do gofmt\nfunc add(a, b int) int {\n return a + b\n}\n\nEm qualquer editor moderno (VS Code, GoLand) o gofmt é executado automaticamente ao salvar. Se não estiver — configure. Isso economizará horas de code review.
3. Tratamento de erros: não ignore, não entre em pânico
\n\nEm Go não há exceções (try-catch). Erros são apenas valores que precisam ser verificados. Este é um dos pontos mais fortes da linguagem, se usado corretamente.
\n\nRegras para trabalho limpo com erros
\n- \n
- Sempre verifique
error. Nunca use_para ignorar. \n - Não use
panicem código de biblioteca. Apenas se o programa não puder continuar (por exemplo, se o config não abrir). \n - Encapsule erros com
fmt.Errorf("contexto: %w", err)(Go 1.13+). \n
// Ruim\nfunc ReadConfig(path string) *Config {\n data, _ := ioutil.ReadFile(path) // ignorando o erro\n var cfg Config\n json.Unmarshal(data, &cfg)\n return &cfg\n}\n\n// Bom\nfunc ReadConfig(path string) (*Config, error) {\n data, err := ioutil.ReadFile(path)\n if err != nil {\n return nil, fmt.Errorf("read config: %w", err)\n }\n var cfg Config\n if err := json.Unma