Guia Rápido de Regras Go
10 exemplos para você começar com as regras do Go - 7 básicos e 3 intermediários.
Busque em todas as páginas da documentação
10 exemplos para você começar com as regras do Go - 7 básicos e 3 intermediários.
mkdir rulesdemo && cd rulesdemo && go mod init example.com/rulesdemo.A formatação canônica é a primeira regra que todo repositório Go compartilha.
gofmt -w .
test -z "$(gofmt -l .)" || echo "arquivos precisam de formatação"package main
import "fmt"
func main() {fmt.Println("antes do gofmt")}gofmt remove completamente o debate sobre formatação da revisão de código.gofmt -l imprimir qualquer caminho.Relacionado: Effective Go como um Padrão Vivo - como a orientação oficial se sobrepõe às regras da equipe
O Go trata erros como valores; ignorá-los viola os idiomas principais.
package main
import (
"fmt"
"os"
)
func main() {
f, err := os.Open("config.yaml")
if err != nil {
fmt.Fprintf(os.Stderr, "abrir config: %v\n", err)
os.Exit(1)
}
defer f.Close()
}err de uma chamada de função precisa de um branch explícito.main decide se deve registrar, envolver ou sair._ descarta apenas quando você aceita deliberadamente a perda de sinal.Relacionado: Erros como Valores: A Filosofia de Erros do Go - por que erros não são exceções
Adicione %w quando os chamadores precisarem de errors.Is ou errors.As.
package demo
import (
"errors"
"fmt"
"io"
)
var ErrNotFound = errors.New("demo: não encontrado")
func Load(r io.Reader) error {
if r == nil {
return fmt.Errorf("load: %w", ErrNotFound)
}
return nil
}load, fetch user).Relacionado: Envolvimento de Erros com %w e errors.As - profundidade e inspeção do envolvimento
Funções de IO e RPC aceitam cancelamento e prazos via contexto.
package demo
import (
"context"
"time"
)
func Fetch(ctx context.Context, id string) error {
ctx, cancel := context.WithTimeout(ctx, 2*time.Second)
defer cancel()
// ... use ctx em chamadas de saída
return nil
}ctx; coloque-o primeiro na assinatura.ctx pela pilha; não o armazene em structs.context.Background() pertence a main, testes e manipuladores de nível superior.Relacionado: Checklist de Regras de Concorrência - regras de cancelamento e propriedade
Mantenha os parâmetros de função flexíveis; mantenha os tipos de retorno específicos.
package demo
import "io"
type Store struct{}
func (s *Store) Save(w io.Writer, data []byte) (int, error) {
return w.Write(data)
}
func NewStore() *Store { return &Store{} }io.Writer, io.Reader ou pequenas interfaces de domínio.*Store evita comportamentos surpreendentes por trás de interfaces sem nome.Relacionado: Regras de Design de API para Bibliotecas Go - regras de nomenclatura e superfície
Identificadores exportados são um contrato de compatibilidade.
// Pacote demo mostra godoc mínimo em exports.
package demo
// Greeter formata uma saudação para o nome.
// Retorna uma string vazia quando o nome está em branco.
func Greeter(name string) string {
if name == "" {
return ""
}
return "hello, " + name
}example_test.go aparecem em pkg.go.dev.Relacionado: Checklist de Regras de Effective Go - lista completa de idiomas
Vet pega erros que o compilador permite.
go vet ./...package main
import "fmt"
func main() {
fmt.Printf("%d", "texto") // vet: incompatibilidade de verbo de formato
}Relacionado: Noções Básicas de Qualidade de Código - formato, vet e hooks
Codifique o comportamento da regra como dados para que os revisores vejam os casos claramente.
package demo
import "testing"
func TestGreeter(t *testing.T) {
tests := []struct {
name string
in string
want string
}{
{"vazio", "", ""},
{"alice", "alice", "hello, alice"},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := Greeter(tt.in); got != tt.want {
t.Fatalf("got %q want %q", got, tt.want)
}
})
}
}t.Run que leiam como itens de checklist.-race quando os testes tocarem em goroutines.Relacionado: Testes Orientados por Tabela e Subtestes - regras de estrutura de teste
Oculte pacotes de implementação que os consumidores não devem importar.
rulesdemo/
go.mod
demo/
public.go
internal/
storage/
storage.go// a raiz do módulo importa apenas pacotes públicos; internal é imposto pelo compilador.
import "example.com/rulesdemo/internal/storage" // falha fora do módulointernal/ são rejeitados pelo compilador entre limites de módulo.internal em vez de apenas documentação para "não importar".Relacionado: Nomenclatura de Pacotes e Diretórios internal/ - regras de layout
Regras de otimização assumem evidências de profiling.
go test -bench=. -benchmem ./...
go test -cpuprofile=cpu.prof -bench=. ./...
go tool pprof -top cpu.profRelacionado: Regras de Desempenho: Quando Otimizar - fluxo de trabalho de medição primeiro
Versões de Stack: Esta página foi escrita para Go 1.26.x (padrão Green Tea GC, go fix modernizers - verifique o patch na compilação), chi (última versão - verifique na compilação), gin (última versão - verifique na compilação), echo (última versão - verifique na compilação), google.golang.org/grpc (última versão - verifique na compilação), sigs.k8s.io/controller-runtime (última versão - verifique na compilação), kubebuilder (última versão - verifique na compilação), tinygo (última versão - verifique os alvos de placa na compilação), wazero (última versão - verifique na compilação) e golangci-lint (última versão - verifique o conjunto de linters na compilação).
Revisado por Chris St. John·Última atualização: 18 de jul. de 2026