Fornece padrões de engenharia de software em Go (Golang) baseados na documentação oficial (go.dev/doc), Effective Go, Go Memory Model e boas práticas de concorrência (goroutines, channels, context), tratamento de erros, genéricos, módulos e testes.
Scanned 9/8/2026
Install to Claude Code
npx -y skills add dandgabr/skills --skill lang-go --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Lang Go?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/dandgabr-lang-go)More formats (shields.io, HTML) on the badges page.
---
name: "lang-go"
description: "Fornece padrões de engenharia de software em Go (Golang) baseados na documentação oficial (go.dev/doc), Effective Go, Go Memory Model e boas práticas de concorrência (goroutines, channels, context), tratamento de erros, genéricos, módulos e testes."
---
# Habilidade de IA: Engenharia de Go (Go Specialist)
Esta skill orienta a inteligência artificial a atuar como especialista na linguagem **Go (Golang)**, seguindo estritamente as diretrizes da documentação oficial ([go.dev/doc](https://go.dev/doc/)), o guia **Effective Go** e o modelo de memória de Go. O objetivo é criar código idiomático, concorrente, de alta performance, fácil manutenção e fortemente testado.
---
## 🧭 Diretrizes Gerais de Desenvolvimento em Go
Ao atuar nesta skill, aplique rigorosamente os seguintes princípios idiomáticos da linguagem:
### 1. Estilo, Nomenclatura e Formatação (Effective Go)
- **`gofmt` Obrigatório**: Todo o código Go deve ser formatado utilizando a ferramenta oficial `gofmt` ou `goimports`.
- **Nomenclatura Simples e Curta**:
- Variáveis locais devem ter nomes curtos e diretos (ex: `i` para índice, `r` para io.Reader, `err` para erro).
- Use `MixedCaps` ou `camelCase` (nunca `snake_case`). Primeira letra maiúscula exporta o identificador para fora do pacote; minúscula mantém o acesso privado.
- **Interfaces Pequenas e Componíveis**: Prefira interfaces enxutas com um ou dois métodos (`io.Reader`, `io.Writer`, `fmt.Stringer`). A implementação é implícita (Duck Typing estático).
- **Sem Getters Ruidosos**: Não prefixe métodos com `Get`. O getter para o campo `user` deve ser nomeado apenas `User()`.
### 2. Tratamento Idiomático de Erros
- **Erros como Valores Explícitos**: Trate erros explicitamente imediatamente após a chamada (`if err != nil`). Nunca ignore erros com o identificador nulo `_` sem motivo documentado.
- **Encadeamento e Inspeção de Erros (Go 1.13+)**:
- Envolva contexto aos erros usando `fmt.Errorf("falha ao processar ordem %d: %w", orderID, err)`.
- Inspecione a cadeia de causa com `errors.Is(err, ErrNotFound)` e extraia tipos com `errors.As(err, &customErr)`.
- **Uso Restrito de `panic` e `recover`**: Reserve `panic` apenas para erros irrecuperáveis na inicialização da aplicação. Em bibliotecas e código de produção, retorne `error`.
### 3. Concorrência e Modelo de Memória
- **"Do not communicate by sharing memory; instead, share memory by communicating."**:
- Prefira o uso de canais (`channels`) e `goroutines` para passar dados e coordenar tarefas entre processos.
- **Gerenciamento de Ciclo de Vida com `context.Context`**:
- Passe `ctx context.Context` como primeiro parâmetro em chamadas de I/O, banco de dados ou RPCs para controlar timeouts e propagação de cancelamentos.
- **Sincronização Primitiva**:
- Use `sync.WaitGroup` para aguardar a conclusão de grupos de goroutines.
- Proteja o acesso concorrente a estruturas compartilhadas usando `sync.Mutex` ou `sync.RWMutex`.
- **Prevenção de Data Races**: Sempre valide a concorrência executando testes com a flag `-race` (`go test -race`).
### 4. Genéricos (Go 1.18+)
- Use parâmetros de tipo (`[T any]`, `[T comparable]`) quando a lógica for genérica para estruturas de dados (filas, pilhas, árvores) ou algoritmos utilitários.
- Não substitua interfaces orientadas a comportamento por genéricos desnecessários.
---
## 🛠️ Estrutura de Projeto e Ecossistema Go
### 1. Organização de Repositório (Standard Go Project Layout)
- **Go Modules (`go.mod`)**: Toda aplicação ou biblioteca deve utilizar módulos nativos.
- **Estrutura de Diretórios Recomendada**:
- `cmd/`: Binários e pontos de entrada (`main.go`).
- `internal/`: Código privado da aplicação que não deve ser importado por outros projetos.
- `pkg/`: Código público de utilidade reutilizável por terceiros.
- `api/`: Definições de contratos OpenAPIs, esquemas gRPC/Protobuf.
### 2. Frameworks e Bibliotecas Consolidadas
- **APIs Web e Roteadores**: `net/http` nativo (com as melhorias do Go 1.22+), `chi`, `gin`, `echo`, `fiber`.
- **Bancos de Dados e ORM**: `database/sql`, `pgx`, `sqlx`, `gorm`, `ent`, `sqlc`.
- **CLIs e Automação**: `cobra`, `viper`.
- **Comunicação RPC**: `gRPC` e `protocol buffers`.
---
## 🧰 Padrões de Código Recomendados
### 1. Handler HTTP Idiomático com Contexto e JSON (Go 1.22+)
```go
package user
import (
"encoding/json"
"errors"
"fmt"
"net/http"
"strconv"
)
type UserService interface {
FindByID(ctx context.Context, id int64) (*User, error)
}
type Handler struct {
service UserService
}
func NewHandler(s UserService) *Handler {
return &Handler{service: s}
}
func (h *Handler) GetUser(w http.ResponseWriter, r *http.Request) {
idStr := r.PathValue("id")
id, err := strconv.ParseInt(idStr, 10, 64)
if err != nil {
http.Error(w, "ID inválido", http.StatusBadRequest)
return
}
user, err := h.service.FindByID(r.Context(), id)
if err != nil {
if errors.Is(err, ErrNotFound) {
http.Error(w, "Usuário não encontrado", http.StatusNotFound)
return
}
http.Error(w, "Erro interno de processamento", http.StatusInternalServerError)
return
}
w.Header().Set("Content-Type", "application/json")
_ = json.NewEncoder(w).Encode(user)
}
```
### 2. Worker Pool Concorrente com Canais e WaitGroup
```go
package worker
import (
"context"
"fmt"
"sync"
)
type Job struct {
ID int
Data string
}
func ProcessJobs(ctx context.Context, jobs []Job, numWorkers int) {
jobChan := make(chan Job, len(jobs))
var wg sync.WaitGroup
for i := 1; i <= numWorkers; i++ {
wg.Add(1)
go func(workerID int) {
defer wg.Done()
for {
select {
case <-ctx.Done():
fmt.Printf("Worker %d interrompido pelo contexto\n", workerID)
return
case job, ok := <-jobChan:
if !ok {
return
}
fmt.Printf("Worker %d processando job %d: %s\n", workerID, job.ID, job.Data)
}
}
}(i)
}
for _, j := range jobs {
jobChan <- j
}
close(jobChan)
wg.Wait()
}
```
### 3. Teste Orientado a Tabelas (Table-Driven Testing)
```go
package calc_test
import (
"testing"
"myproject/calc"
)
func TestDivide(t *testing.T) {
tests := []struct {
name string
a, b float64
want float64
wantErr bool
}{
{name: "divisão exata", a: 10, b: 2, want: 5, wantErr: false},
{name: "divisão por zero", a: 10, b: 0, want: 0, wantErr: true},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got, err := calc.Divide(tt.a, tt.b)
if (err != nil) != tt.wantErr {
t.Fatalf("Divide(%f, %f) erro inesperado = %v, wantErr %v", tt.a, tt.b, err, tt.wantErr)
}
if got != tt.want {
t.Errorf("Divide(%f, %f) = %f, esperava %f", tt.a, tt.b, got, tt.want)
}
})
}
}
```
---
## 🔒 Questões de Segurança e Práticas Seguras
- **Goroutine Leaks e Race Conditions**: Utilize sempre o detector de race conditions do Go (`go test -race`) durante o ciclo de testes. Certifique-se de que todas as goroutines possuem uma condição clara de término para evitar vazamentos de memória.
- **Manipulação Insegura (`unsafe` Package)**: Minimize o uso do pacote `unsafe`. Casts arbitrários de memória contornam a segurança de tipos do Go e podem levar a corrupções de memória inesperadas.
- **Geração de Segredos**: Nunca use `math/rand` para gerar tokens, senhas ou identificadores de sessão. Sempre utilize `crypto/rand` para geração de valores criptograficamente seguros.
- **Injeção de Comando em Processos**: Ao usar `os/exec`, evite passar strings concatenadas diretamente a shells como `sh` ou `bash`. Forneça argumentos como fatias separadas (`[]string`).
## 🔗 Integração com Outras Skills
- Para construir ferramentas de automação, varredura ou scripts de testes de invasão em Go, consulte [pentest-scripter-python-bash-go](../../security/appsec/pentest-scripter-python-bash-go/SKILL.md).
- Para integrar chamadas concorrentes e transacionais em bancos de dados em Go (`database/sql`, `pgx`, `gorm`, `sqlc`), consulte [dba-database-administrator](../../roles/dba-database-administrator/SKILL.md), [db-postgresql](../../databases/db-postgresql/SKILL.md), [db-mariadb](../../databases/db-mariadb/SKILL.md), [db-sqlite](../../databases/db-sqlite/SKILL.md) e [db-mongodb](../../databases/db-mongodb/SKILL.md).
- Para aplicar análise estática de código e segurança em serviços web em Go, consulte [sast-code-review](../../security/appsec/sast-code-review/SKILL.md) e [appsec-owasp-asvs](../../security/appsec/appsec-owasp-asvs/SKILL.md).
- Para projetar arquiteturas de microsserviços escaláveis em Go, consulte [software-architect](../../roles/software-architect/SKILL.md).
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!