Pular para o conteúdo
Skillpedia
Código em geral280 mil · #61

golang-patterns

Ajuda seu agente a escrever código Go seguindo as melhores práticas. Garante que o código seja robusto, eficiente e fácil de manter.

O que ela faz

Este guia ensina as melhores práticas e convenções para escrever código na linguagem de programação Go. Ele ajuda a criar programas mais fáceis de entender, eficientes e que funcionam bem.

Quando usar

  • ✓Ao começar a escrever um novo programa em Go.
  • ✓Ao revisar o código de outra pessoa ou o seu próprio.
  • ✓Ao organizar ou melhorar partes de um programa existente.

Exemplo do que pedir para a IA

“Como posso escrever uma função em Go que seja fácil de ler e entender?”

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

https://github.com/affaan-m/ECC/blob/main/pi/core/skills/golang-patterns/SKILL.md

Mensagem pronta para colar

Use esta skill para me ajudar: https://github.com/affaan-m/ECC/blob/main/pi/core/skills/golang-patterns/SKILL.md Leia o arquivo SKILL.md desse link e siga as instruções dele na minha tarefa.
Como funciona

O guia mostra exemplos de código bom e ruim para ilustrar os princípios. Ele explica como tornar o código simples, como usar valores padrão de forma inteligente e como lidar com erros de maneira clara.

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 affaan-m/ECC --skill golang-patterns

Ou baixe só o arquivo:

curl -L https://raw.githubusercontent.com/affaan-m/ECC/main/pi/core/skills/golang-patterns/SKILL.md -o SKILL.md
Conteúdo técnico (SKILL.md)

Tradução do texto original do autor no GitHub. Os comandos e códigos estão como no original.

Padrões de Desenvolvimento em Go

Padrões idiomáticos de Go e melhores práticas para construir aplicações robustas, eficientes e fáceis de manter.

Quando Ativar

  • Escrevendo código Go novo
  • Revisando código Go
  • Refatorando código Go existente
  • Projetando pacotes/módulos Go

Princípios Fundamentais

1. Simplicidade e Clareza

Go favorece a simplicidade em vez da astúcia. O código deve ser óbvio e fácil de ler.

// Good: Clear and direct
func GetUser(id string) (*User, error) {
    user, err := db.FindUser(id)
    if err != nil {
        return nil, fmt.Errorf("get user %s: %w", id, err)
    }
    return user, nil
}

// Bad: Overly clever
func GetUser(id string) (*User, error) {
    return func() (*User, error) {
        if u, e := db.FindUser(id); e == nil {
            return u, nil
        } else {
            return nil, e
        }
    }()
}

2. Torne o Valor Zero Útil

Projete tipos de forma que seu valor zero seja imediatamente utilizável sem inicialização.

// Good: Zero value is useful
type Counter struct {
    mu    sync.Mutex
    count int // zero value is 0, ready to use
}

func (c *Counter) Inc() {
    c.mu.Lock()
    c.count++
    c.mu.Unlock()
}

// Good: bytes.Buffer works with zero value
var buf bytes.Buffer
buf.WriteString("hello")

// Bad: Requires initialization
type BadCounter struct {
    counts map[string]int // nil map will panic
}

3. Aceite Interfaces, Retorne Structs

Funções devem aceitar parâmetros de interface e retornar tipos concretos.

// Good: Accepts interface, returns concrete type
func ProcessData(r io.Reader) (*Result, error) {
    data, err := io.ReadAll(r)
    if err != nil {
        return nil, err
    }
    return &Result{Data: data}, nil
}

// Bad: Returns interface (hides implementation details unnecessarily)
func ProcessData(r io.Reader) (io.Reader, error) {
    // ...
}

Padrões de Tratamento de Erros

Envolvimento de Erros com Contexto

// Good: Wrap errors with context
func LoadConfig(path string) (*Config, error) {
    data, err := os.ReadFile(path)
    if err != nil {
        return nil, fmt.Errorf("load config %s: %w", path, err)
    }

    var cfg Config
    if err := json.Unmarshal(data, &cfg); err != nil {
        return nil, fmt.Errorf("parse config %s: %w", path, err)
    }

    return &cfg, nil
}

Tipos de Erro Personalizados

// Define domain-specific errors
type ValidationError struct {
    Field   string
    Message string
}

func (e *ValidationError) Error() string {
    return fmt.Sprintf("validation failed on %s: %s", e.Field, e.Message)
}

// Sentinel errors for common cases
var (
    ErrNotFound     = errors.New("resource not found")
    ErrUnauthorized = errors.New("unauthorized")
    ErrInvalidInput = errors.New("invalid input")
)

Verificação de Erros com errors.Is e errors.As

func HandleError(err error) {
    // Check for specific error
    if errors.Is(err, sql.ErrNoRows) {
        log.Println("No records found")
        return
    }

    // Check for error type
    var validationErr *ValidationError
    if errors.As(err, &validationErr) {
        log.Printf("Validation error on field %s: %s",
            validationErr.Field, validationErr.Message)
        return
    }

    // Unknown error
    log.Printf("Unexpected error: %v", err)
}

Nunca Ignore Erros

// Bad: Ignoring error with blank identifier
result, _ := doSomething()

// Good: Handle or explicitly document why it's safe to ignore
result, err := doSomething()
if err != nil {
    return err
}

// Acceptable: When error truly doesn't matter (rare)
_ = writer.Close() // Best-effort cleanup, error logged elsewhere

Padrões de Concorrência

Pool de Workers

func WorkerPool(jobs <-chan Job, results chan<- Result, numWorkers int) {
    var wg sync.WaitGroup

    for i := 0; i < numWorkers; i++ {
        wg.Add(1)
        go func() {
            defer wg.Done()
            for job := range jobs {
                results <- process(job)
            }
        }()
    }

    wg.Wait()
    close(results)
}

Contexto para Cancelamento e Timeouts

func FetchWithTimeout(ctx context.Context, url string) ([]byte, error) {
    ctx, cancel := context.WithTimeout(ctx, 5*time.Second)
    defer cancel()

    req, err := http.NewRequestWithContext(ctx, "GET", url, nil)
    if err != nil {
        return nil, fmt.Errorf("criar requisição: %w", err)
    }

    resp, err := http.DefaultClient.Do(req)
    if err != nil {

…
Perguntas frequentes

O que significa 'idiomatic Go'?

Significa escrever código Go de uma maneira que os desenvolvedores experientes em Go consideram natural, clara e eficiente, seguindo as convenções estabelecidas pela comunidade.

Por que é importante seguir essas práticas?

Seguir essas práticas torna o código mais fácil de ser lido, mantido e depurado por você e por outros programadores, além de melhorar o desempenho e a robustez do programa.

Onde posso ver mais exemplos?

O guia contém exemplos de código para ilustrar cada princípio, mostrando como aplicá-los na prática.

Detalhes

Descrição original do autor

Idiomatic Go patterns, best practices, and conventions for building robust, efficient, and maintainable Go applications. Use when writing or reviewing Go code and idiomatic structure or conventions are in question.

repo: affaan-m/ECC

Popularidade

Estrelas no GitHub
280 mil
Posição no ranking
#61
Licença
MIT
Atualizada em
15/10/2026

Essa skill é útil?

0

Entre para votar.

Comentários

  • …

Mais skills deste repositório

Skills parecidas