Como escrever código limpo em Go: 7 regras para profissionais

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Introdução: por que código limpo em Go não é luxo, mas necessidade

\n\n

Go (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.

\n\n

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\n

1. Nomes de variáveis corretos: curto e claro

\n\n

Em 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.

\n\n

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ão Http ou Url).
  • \n
\n\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\n

Dica: se o nome de uma variável tem mais de 2 palavras — provavelmente você está complicando algo.

\n\n

2. Formatação: confie no gofmt

\n\n

Em 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".

\n\n

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
\n\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\n

Em qualquer editor moderno (VS Code, GoLand) o gofmt é executado automaticamente ao salvar. Se não estiver — configure. Isso economizará horas de code review.

\n\n

3. Tratamento de erros: não ignore, não entre em pânico

\n\n

Em 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\n

Regras para trabalho limpo com erros

\n
    \n
  • Sempre verifique error. Nunca use _ para ignorar.
  • \n
  • Não use panic em 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
\n\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                

Blogs

Book Recommendations