go
Orienta seu agente a escrever código Go eficiente e legível. Ajuda a criar serviços de rede e sistemas distribuídos rapidamente.
O que ela faz
Este guia ensina as melhores práticas para escrever código na linguagem de programação Go. Ele mostra como lidar com erros, usar listas (slices) e dicionários (maps), e gerenciar tarefas simultâneas (goroutines e channels) de forma eficiente e clara.
Quando usar
- ✓Ao aprender a programar em Go.
- ✓Ao revisar ou melhorar código Go existente.
- ✓Ao encontrar erros comuns em Go.
Exemplo do que pedir para a IA
“Como posso lidar com erros de forma correta em Go?”
Quer saber mais? Abra as seções abaixo.
Como usar
O jeito mais fácil: copie a mensagem abaixo e cole no Claude, ChatGPT, Cursor ou outra IA. Ela lê a skill e segue as instruções.
Link da skill
Mensagem pronta para colar
Como funciona
O guia compara exemplos de código 'ruins' com exemplos 'bons' para ilustrar as práticas recomendadas. Ele explica o porquê de uma abordagem ser melhor que a outra, focando na clareza e eficiência.
Instalação
Jeito mais fácil: copie o link da skill e cole no Claude, ChatGPT ou Cursor pedindo para seguir as instruções.
No terminal (Claude Code, Codex, Cursor), na pasta do projeto:
npx skills add sickn33/agentic-awesome-skills --skill goOu baixe só o arquivo:
curl -L https://raw.githubusercontent.com/sickn33/agentic-awesome-skills/main/plugins/agentic-awesome-skills-claude/skills/super-code/go/SKILL.md -o SKILL.mdConteúdo técnico (SKILL.md)
Tradução do texto original do autor no GitHub. Os comandos e códigos estão como no original.
Go: Referência de Eficiência Idiomática
Quando Usar
- Use esta habilidade quando a tarefa corresponder a esta descrição: Diretrizes de supercódigo específicas da linguagem para Go.
Sumário
- Tratamento de Erros
- Slices e Maps
- Goroutines e Canais
- Structs e Interfaces
- Funções e Closures
- Anti-padrões específicos de Go
1. Tratamento de Erros {#errors}
// ❌ Ignoring errors
result, _ := os.Open(path)
// ✅ — always handle; only use _ when error is provably irrelevant
result, err := os.Open(path)
if err != nil {
return fmt.Errorf("open %s: %w", path, err)
}
// ❌ Redundant error variable
err := doA()
if err != nil { return err }
err = doB()
if err != nil { return err }
// ✅ — each :=/: is fine; this is idiomatic Go. Don't try to "fix" it.
// What you CAN simplify: collapsing to one-liners where the if body is a single return
if err := doA(); err != nil { return err }
if err := doB(); err != nil { return err }
// ❌ Custom error type with no added value
type MyError struct{ msg string }
func (e MyError) Error() string { return e.msg }
// ✅ — use errors.New or fmt.Errorf unless callers need to inspect type
var ErrNotFound = errors.New("not found")
return fmt.Errorf("lookup %q: %w", key, ErrNotFound)
Envolva erros com %w (não %v) para que os chamadores possam usar errors.Is / errors.As.
2. Slices e Maps {#slices}
// ❌ Growing a slice without pre-allocation when size is known
var result []string
for _, item := range items {
result = append(result, item.Name)
}
// ✅
result := make([]string, 0, len(items))
for _, item := range items {
result = append(result, item.Name)
}
// ❌ Manual existence check before map write
if _, ok := m[key]; !ok {
m[key] = []string{}
}
m[key] = append(m[key], value)
// ✅ — append to nil slice is valid Go
m[key] = append(m[key], value)
// ❌ Copying a map by assignment (copies reference)
copy := original
// ✅
copy := make(map[K]V, len(original))
for k, v := range original { copy[k] = v }
3. Goroutines e Canais {#concurrency}
// ❌ Fire-and-forget goroutine with no lifecycle
go doWork()
// ✅ — use errgroup or WaitGroup to track completion
var wg sync.WaitGroup
wg.Add(1)
go func() {
defer wg.Done()
doWork()
}()
wg.Wait()
// ❌ Unbuffered channel causing unnecessary goroutine block
ch := make(chan Result)
go func() { ch <- compute() }()
result := <-ch
// ✅ — for single-result, buffered channel avoids goroutine leak if receiver exits early
ch := make(chan Result, 1)
go func() { ch <- compute() }()
result := <-ch
// ❌ select with a busy-wait default
for {
select {
case v := <-ch:
process(v)
default:
// spin
}
}
// ✅ — blocking select unless you genuinely need non-blocking
for v := range ch {
process(v)
}
Use golang.org/x/sync/errgroup para fan-out com coleta de erros.
4. Structs e Interfaces {#structs}
// ❌ Large interface
type Storage interface {
Get(key string) ([]byte, error)
Set(key string, val []byte) error
Delete(key string) error
List(prefix string) ([]string, error)
// ... 10 more methods
}
// ✅ — small, composable interfaces
type Getter interface { Get(key string) ([]byte, error) }
type Setter interface { Set(key string, val []byte) error }
type Storage interface { Getter; Setter }
// ❌ Returning concrete struct from constructor (ties callers to implementation)
func NewStore() *RedisStore { ... }
// ✅ — return interface when you have or anticipate multiple implementations
func NewStore() Storage { return &RedisStore{...} }
// ❌ Pointer receiver for tiny value types
func (p *Point) X() float64 { return p.x }
// ✅ — value receiver for small immutable types
func (p Point) X() float64 { return p.x }
Regra: receptor de ponteiro quando o método muta o estado OU a struct é grande (>3 campos de tamanho não trivial). Receptor de valor caso contrário.
5. Funções e Closures {#functions}
// ❌ Named return values used just to avoid a variable declaration
func divide(a, b float64) (result float64, err error) {
result = a / b
return
}
// ✅ — named returns are worth it only for deferred mutation or documentation
func divide(a, b float64) (float64, error) {
if b == 0 { return 0, errors.New("division by zero") }
return a / b, nil
}
…
Perguntas frequentes
O que são 'goroutines' e 'channels'?
São ferramentas do Go para executar várias tarefas ao mesmo tempo (goroutines) e para que essas tarefas se comuniquem de forma segura (channels).
Por que é importante 'envelopar' erros com `%w`?
Usar `%w` permite que o código que recebe o erro possa verificar se ele veio de um erro específico, usando funções como `errors.Is` ou `errors.As`.
O que são 'anti-padrões'?
São práticas de programação que, embora possam funcionar, geralmente levam a código mais confuso, ineficiente ou propenso a erros. O guia mostra como evitá-los em Go.
Detalhes
Descrição original do autor
Language-specific super-code guidelines for go.
Popularidade
- Estrelas no GitHub
- 48 mil
- Posição no ranking
- #4278
- Licença
- MIT
- Atualizada em
- 15/10/2026
Comentários
- …
Mais skills deste repositório
00-andruia-consultant
Ajuda seu agente a iniciar ou melhorar projetos de IA. Ele analisa código, sugere ferramentas e cria planos de ação em espanhol.
sickn33/agentic-awesome-skills
007
Faz seu agente realizar auditorias de segurança e modelagem de ameaças. É útil para proteger projetos contra ataques e vulnerabilidades.
sickn33/agentic-awesome-skills
10-andruia-skill-smith
Ajuda seu agente a criar ou melhorar ferramentas de IA. Ele define como as ferramentas funcionam, escreve a documentação e valida a estrutura.
sickn33/agentic-awesome-skills
20-andruia-niche-intelligence
Faz seu agente criar um resumo sobre um setor específico. É útil para entender o contexto, regras, padrões de uso e riscos de um projeto, usando fontes confiáveis.
sickn33/agentic-awesome-skills
Skills parecidas
benchmark-optimization-loop
Faz seu agente melhorar a velocidade de algo de forma medida. Ele testa várias versões e escolhe a mais rápida que ainda funciona corretamente.
affaan-m/ECC
change-impact
Ajuda seu agente a analisar o impacto de mudanças no código antes de fazê-las. Ele compara o planejado com o real depois, cobrindo caminhos, dados, testes e documentação. É útil para mudanças arriscadas ou que afetam várias partes do sistema.
affaan-m/ECC
click-path-audit
Faz seu agente rastrear todos os botões e interações do usuário para achar bugs. Ele encontra problemas onde funções parecem funcionar sozinhas, mas falham juntas. Útil quando bugs persistem mesmo após depuração.
affaan-m/ECC