Por que até um código genial pode arruinar um projeto?
\n\nImagine: você programa em Go. O código funciona rápido, os testes passam e a produção agrada com estabilidade. Mas na segunda-feira chega um novo desenvolvedor, abre seu módulo e… fica perplexo. Variáveis nomeadas como x1, data2, tmp. Funções — func1, process. Imports espalhados caoticamente. O código compila, mas entendê-lo é uma tarefa digna de estrela.
Situação familiar? Se você trabalha em equipe, code style e convenções para Go — não é um capricho de linter, mas sim sua linguagem comum. Sem ele, até o desenvolvedor mais talentoso se torna um "jogador solo" que atrasa toda a equipe. Neste artigo, vamos abordar como programar em Go para que seu código seja lido, compreendido e amado pelos colegas. E também — como não cair na armadilha do "rápido, mas sujo".
\n\nGo é sobre simplicidade. Mas a simplicidade precisa ser combinada
\n\nA linguagem Go foi criada pensando no trabalho em equipe. Não é à toa que Rob Pike e Ken Thompson incorporaram a ideia de "legibilidade acima de tudo". No entanto, mesmo em Go, é possível escrever código que funciona, mas que dá vontade de reescrever do zero.
\n\nVamos analisar os blocos-chave que transformam o caos em um sistema organizado.
\n\n1. gofmt — seu primeiro amigo e aliado
\n\nGo possui uma ferramenta de formatação embutida — gofmt. Não é apenas "enfeite". É um padrão. Se você não usa gofmt — está violando a convenção. Ponto final.
Exemplo: imagine que um desenvolvedor usa tabs para indentação, outro usa espaços. Em Go, esse problema está resolvido de uma vez por todas. gofmt padroniza o código. Execute-o antes de cada commit. Melhor ainda: configure um pre-commit hook.
// Ruim (sem gofmt)\nfunc add(a int,b int) int {\nreturn a+b\n}\n\n// Bom (após gofmt)\nfunc add(a, b int) int {\n return a + b\n}\n\n\nDica: Em IDEs modernas (VS Code, GoLand), o gofmt é executado automaticamente ao salvar. Verifique as configurações — isso economizará horas de code review.
2. Nomenclatura: fale a linguagem do domínio
\n\nGo incentiva nomes curtos. Mas curtos não significa sem sentido. A regra é simples: quanto maior o escopo, mais longo o nome.
\n\n- \n
- Variáveis locais (dentro de uma função) — 1-2 caracteres:
i,j,s,err. \n - Parâmetros de função — significativos, mas concisos:
ctx,req,db. \n - Funções e tipos exportados — nomes completos:
CreateUser,UserService. \n
Exemplo ruim:
\nfunc p(u string, pwd string) bool {\n return u == "admin" && pwd == "12345"\n}\n\n\nExemplo bom:
\nfunc IsValidCredentials(username, password string) bool {\n return username == "admin" && password == "12345"\n}\n\n\nObserve: IsValidCredentials não é apenas um nome, é documentação. Outro desenvolvedor entenderá imediatamente o que a função faz, sem precisar olhar o corpo.
3. Imports: ordem é a chave para a tranquilidade
\n\nEm Go, os imports são divididos em três grupos:
\n- \n
- Biblioteca padrão (fmt, net/http, os). \n
- Pacotes externos (github.com/xxx). \n
- Pacotes internos (seu projeto). \n
Entre os grupos — uma linha em branco. Esta é uma regra não dita, mas rigorosa. O gofmt não a verifica, mas o code review — com certeza.
import (\n "fmt"\n "os"\n\n "github.com/gorilla/mux"\n "github.com/lib/pq"\n\n "yourproject/internal/config"\n "yourproject/internal/handler"\n)\n\n\nPor que isso é importante? Quando os imports estão espalhados, você perde tempo procurando um pacote. Uma ordem única acelera a leitura do código.
\n\n