Skip to content
Back to skills

Lang Go

ASecurity

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.

  • 10 stars
  • 0 votes
  • 0 copies
  • 3 views
  • Added September 8, 2026
databasespythongoshellbashsqltestingcode-reviewapidatabasesecurity

Works with

  • cli
  • api

Security analysis

A100/100

Scanned September 8, 2026

npx -y skills add dandgabr/skills --skill lang-go --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Lang Go?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Lang Go
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/dandgabr-lang-go/badge)](https://www.skillsdirectory.com/skills/dandgabr-lang-go)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
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).

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.