← Ver a árvore completa

ROTA · 30 CLASSES · 1 GRUPOS

O Jeito Go

Escreva código idiomático, legível e alinhado às decisões da comunidade Go.

Pré-requisitos orientam, mas nunca bloqueiam. Cinco classes da árvore são grátis com conta.

O ARCO DA ROTA

01Idiomático

ORDEM RECOMENDADA

30 classes, do primeiro passo ao fechamento.

Cada classe leva cerca de 15–25 minutos no novo formato de slides. Você pode sair da ordem quando outro nó fizer mais sentido.

  1. 01
    Formagofmt e a forma compartilhada do Go

    Use gofmt para eliminar debates de formatação e separar mudanças de forma de mudanças de comportamento em Go.

  2. 02
    FormaNomes de pacotes que desaparecem no uso

    Escolha nomes de pacotes Go curtos e específicos, evitando stutter e aliases que pioram a leitura no call site.

  3. 03
    FormaVariáveis e receivers com nomes proporcionais ao contexto

    Use MixedCaps, nomes proporcionais ao escopo e receivers curtos e consistentes para tornar código Go previsível.

  4. 04
    FormaGetters, setters e interfaces que soam como Go

    Nomeie getters sem Get, preserve Set quando há mutação e crie pequenas interfaces -er no lado consumidor.

  5. 05
    FormaDoc comments que explicam contratos

    Escreva doc comments que começam pelo nome exportado e registram contrato, bordas e efeitos em vez de narrar implementação.

  6. 06
    Fluxo e declaraçõesIf idiomático com o caminho feliz visível

    Use early returns, if com init statement e indentação mínima no caminho feliz para tornar validações Go legíveis.

  7. 07
    Fluxo e declaraçõesFor e range sem índices acidentais

    Escolha entre range e o for clássico pelo que o corpo do loop realmente consome: valor, índice ou controle.

  8. 08
    Fluxo e declaraçõesSwitch para decisões mutuamente exclusivas

    Substitua cadeias de else-if por switch, use o switch sem expressão para faixas e entenda por que Go não tem fallthrough implícito.

  9. 09
    Fluxo e declaraçõesnew, make e a inicialização que o tipo pede

    Entenda o que new(T) devolve, por que slices, maps e channels precisam de make e quando o zero value já basta.

  10. 10
    Fluxo e declaraçõesSlices vazios: nil por padrão, alocados por contrato

    Declare slices vazios com var, entenda quando nil e vazio não nil são intercambiáveis e onde JSON os distingue.

  11. 11
    DadosComposite literals e constructors com invariantes

    Escolha entre literal composto com campos nomeados e constructor: literais para dados diretos, funções New para invariantes e defaults.

  12. 12
    DadosArrays e slices escolhidos pelo contrato

    Use arrays quando o comprimento fixo pertence ao tipo — endereços, hashes, blocos de protocolo — e slices para sequências variáveis.

  13. 13
    DadosMaps idiomáticos com comma-ok e sets

    Domine leituras com zero value, comma-ok para presença, sets como map de struct vazio e saída determinística ordenando chaves.

  14. 14
    DadosPasse valores; use ponteiros por semântica

    Passe valores por padrão; reserve ponteiros para mutação, identidade e tipos que não podem ser copiados — nunca para economizar bytes.

  15. 15
    DadosEmbedding para promoção deliberada

    Embuta um tipo quando o method set promovido deve ser API do tipo externo; use campo nomeado para conter sem expor.

  16. 16
    Funções e métodosMúltiplos retornos e resultados nomeados sem sombra

    Aprenda múltiplos retornos e resultados nomeados sem sombra por meio de um programa Go funcional e um refactor guiado que preserva comportamento.

  17. 17
    Funções e métodosdefer idiomático, inclusive dentro de loops

    Aprenda defer idiomático, inclusive dentro de loops por meio de um programa Go funcional e um refactor guiado que preserva comportamento.

  18. 18
    Funções e métodosReceiver pointer ou value: uma decisão consistente

    Aprenda receiver pointer ou value: uma decisão consistente por meio de um programa Go funcional e um refactor guiado que preserva comportamento.

  19. 19
    Funções e métodosAPIs síncronas que o chamador consegue compor

    Aprenda apis síncronas que o chamador consegue compor por meio de um programa Go funcional e um refactor guiado que preserva comportamento.

  20. 20
    InterfacesInterfaces pequenas no lado consumidor

    Aprenda interfaces pequenas no lado consumidor por meio de um programa Go funcional e um refactor guiado que preserva comportamento.

  21. 21
    InterfacesSatisfação implícita como ferramenta de design

    Aprenda satisfação implícita como ferramenta de design por meio de um programa Go funcional e um refactor guiado que preserva comportamento.

  22. 22
    InterfacesComma-ok em vez de erros escondidos nos dados

    Aprenda comma-ok em vez de erros escondidos nos dados por meio de um programa Go funcional e um refactor guiado que preserva comportamento.

  23. 23
    ErrosError strings que compõem mensagens

    Aprenda error strings que compõem mensagens por meio de um programa Go funcional e um refactor guiado que preserva comportamento.

  24. 24
    ErrosWrapping e inspeção da cadeia de erros

    Aprenda wrapping e inspeção da cadeia de erros por meio de um programa Go funcional e um refactor guiado que preserva comportamento.

  25. 25
    ErrosNão entre em pânico por falhas esperadas

    Aprenda não entre em pânico por falhas esperadas por meio de um programa Go funcional e um refactor guiado que preserva comportamento.

  26. 26
    ErrosTrate o erro uma vez

    Aprenda trate o erro uma vez por meio de um programa Go funcional e um refactor guiado que preserva comportamento.

  27. 27
    Concorrência idiomáticaCompartilhe memória por comunicação

    Aprenda compartilhe memória por comunicação por meio de um programa Go funcional e um refactor guiado que preserva comportamento.

  28. 28
    Concorrência idiomáticaCiclo de vida explícito para cada goroutine

    Aprenda ciclo de vida explícito para cada goroutine por meio de um programa Go funcional e um refactor guiado que preserva comportamento.

  29. 29
    Concorrência idiomáticaContexts como primeiro parâmetro e nunca como campo

    Aprenda contexts como primeiro parâmetro e nunca como campo por meio de um programa Go funcional e um refactor guiado que preserva comportamento.

  30. 30
    Concorrência idiomáticacrypto/rand e outras armadilhas de revisão

    Aprenda crypto/rand e outras armadilhas de revisão por meio de um programa Go funcional e um refactor guiado que preserva comportamento.

PRÉVIA DA PRIMEIRA CLASSE

gofmt e a forma compartilhada do Go

source := []byte("package demo\nfunc Sum(a,b int)int{return a+b}\n")
formatted, err := format.Source(source)
if err != nil {
	fmt.Println("fonte inválida:", err) // gofmt exige sintaxe válida
} else {
	fmt.Print(string(formatted)) // mesma lógica, forma canônica
}

Duas pessoas abrem o mesmo arquivo e enxergam uma régua diferente. Uma alinha colunas com espaços; outra usa tabs. Uma quebra a chamada depois de 80 caracteres; outra mantém tudo na linha. Se cada revisão precisar decidir qual régua vence, um detalhe visual consome o tempo que deveria confirmar cálculo, erro e contrato. Go retira essa negociação da equipe: a régua é um programa.

A seção “Formatting” de Effective Go diz que os formatos de gofmt e go fmt são o padrão. Não é uma recomendação vaga de “manter o código bonito”. gofmt analisa fonte Go válida e a imprime em uma forma canônica: indentação por tabs, espaços ao redor de operadores, layout de declarações e várias quebras. go fmt ./... aplica o formatador aos pacotes encontrados pelo comando go; gofmt -w arquivo.go atua diretamente nos arquivos indicados.

Isso muda a revisão. Um arquivo formatado não prova que o programa está correto, mas elimina uma classe inteira de escolhas semânticas falsas. O revisor pode assumir a forma básica e perguntar o que realmente mudou. O formatador também não é linter: não troca nomes ruins, não remove um else desnecessário e não transforma um algoritmo. Essa fronteira será central nos exercícios.

Considere um gerador de linha de cobrança. A versão recebida funciona e imprime café x3 = 21, mas chega como uma linha comprimida, com espaços arbitrários e imports agrupados à mão. O comportamento está certo; a apresentação cria atrito e dificulta enxergar o retorno. O primeiro passo seguro não é “arrumar enquanto leio”. É executar gofmt, observar o diff mecânico e só então fazer um segundo refactor semântico pequeno.

Há uma razão operacional: misturar formatação de um arquivo inteiro com mudança de regra produz um diff enorme. A alteração importante some entre linhas movidas. Formate cedo, configure o editor para formatar ao salvar e mantenha commits de normalização separados quando entrar em código legado. A forma automática reduz conflitos; a separação de commits preserva a capacidade de revisar.

Pense também no merge. Dois branches que acrescentam lógica perto da mesma função já podem conflitar; se cada pessoa ainda reindenta o bloco segundo uma preferência, a área de conflito cresce sem ganho para o usuário. Quando ambos salvam a saída de gofmt, linhas inalteradas tendem a permanecer byte a byte iguais. O formatador não elimina conflitos semânticos, mas para de fabricar conflitos de apresentação.

O princípio vale para exemplos, testes e ferramentas internas, não apenas para código publicado. Uma fence copiada para documentação vira ponto de partida de alguém; um harness mal formatado ensina uma exceção visual; um arquivo temporário pode entrar no commit. Trate a forma canônica como propriedade do repositório inteiro. Assim, “rode gofmt” deixa de ser comentário repetido em revisão e vira uma garantia automatizada antes que o diff chegue a outra pessoa para uma revisão de verdade.

O programa usa o pacote padrão go/format, a mesma família de printer usada pelas ferramentas, para formatar uma string em memória. Antes de executar, preveja se o texto A+B dentro da string de saída será alterado. Depois troque a+b no código-fonte por a * b, quebre o return em outra posição e compare.

A introdução termina aqui

Entre para continuar nos slides, rodar o código e enfrentar os desafios.

Começar pela rota →

ESTA ROTA E TODAS AS OUTRAS

Qualquer plano abre os 188 nós.

Mensal R$19,90 · anual R$149 · lifetime R$499. Todos têm garantia de 7 dias.

Comparar os 3 planos →Começar pelas classes grátis