Cheatsheet

← Voltar para página principal
Go Programming Cheatsheet

Guia completo de Go para desenvolvimento moderno e concorrente

🐹 O que é Go?

📖 Definição

Go é uma linguagem de programação compilada e concorrente desenvolvida pelo Google. Projetada para ser simples, eficiente e escalável, é ideal para construção de sistemas distribuídos, microserviços e aplicações de alto desempenho.

💪 Por que aprender?

• Sintaxe simples e limpa
• Tipagem estática forte
• Garbage collection
• Modelos de concorrência nativos
• Tempo de compilação rápido
• Cross-platform

🚀 O que você pode fazer?

• APIs e microserviços
• Sistemas distribuídos
• Ferramentas de linha de comando
• Aplicações em nuvem
• Networking e servidores

💡 Onde você vai usar:
🚀 Backend
APIs, Microserviços
☁️ Cloud
Docker, Kubernetes, Cloud
Concorrência
Goroutines, Canais
🔧 Ferramentas
CLI, DevOps, SRE
Filtro ativo:Todos
Total: 13 categoriasBásico: 5Intermediário: 5Avançado: 3

🚀 Instalação e Ambiente

Use quando: Configurando ambiente Go, instalando ferramentas, configurando variáveis

📋Instalação

Básico
# Instalar Go (Linux/macOS)

# Baixar e instalar

Básico
wget https://golang.org/dl/go1.21.0.linux-amd64.tar.gz

# Download do Go

Básico
sudo tar -C /usr/local -xzf go1.21.0.linux-amd64.tar.gz

# Extrair para /usr/local

Básico
export PATH=$PATH:/usr/local/go/bin

# Adicionar ao PATH

Básico
echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc

# Persistir no bashrc

Básico
# Instalar Go (Windows)

# Download do instalador

Básico
# Visit: https://golang.org/dl/

# Baixar instalador .msi

📋Variáveis de Ambiente

Básico
go version

# Verificar versão instalada

Básico
go env

# Ver todas as variáveis de ambiente

Básico
go env GOPATH

# Ver GOPATH

Básico
go env GOROOT

# Ver GOROOT

Básico
go env GOOS

# Ver sistema operacional

Básico
go env GOARCH

# Ver arquitetura

Básico
export GOPATH=$HOME/go

# Configurar GOPATH

Básico
export PATH=$PATH:$GOPATH/bin

# Adicionar GOPATH/bin ao PATH

📋Ferramentas

Básico
go help

# Ajuda geral do Go

Básico
go help command

# Ajuda de comando específico

Básico
go tool

# Listar ferramentas disponíveis

Básico
go doc

# Documentação local

Básico
go fmt

# Formatador de código

Básico
go vet

# Analisador estático

Básico
go mod

# Gerenciador de módulos

📁 Estrutura de Projetos

Use quando: Criando novos projetos, organizando código, gerenciando dependências

📋Módulos Go

Básico
go mod init example.com/myproject

# Iniciar novo módulo

Básico
go mod init github.com/user/project

# Módulo no GitHub

Básico
go mod tidy

# Organizar dependências

Básico
go mod download

# Baixar dependências

Básico
go mod verify

# Verificar dependências

Básico
go mod why example.com/pkg

# Por que pacote é necessário

Básico
go list -m all

# Listar todos os módulos

Básico
go mod graph

# Gráfico de dependências

📋Estrutura de Diretórios

Básico
mkdir -p cmd/myapp

# Aplicações principais

Básico
mkdir -p pkg/utils

# Bibliotecas reutilizáveis

Básico
mkdir -p internal/config

# Código interno

Básico
mkdir -p api/proto

# Definições de API

Básico
mkdir -p web/static

# Assets web

Básico
mkdir -p deployments

# Configurações deploy

Básico
mkdir -p scripts

# Scripts utilitários

Básico
mkdir -p docs

# Documentação

📋Build e Execução

Básico
go run main.go

# Executar diretamente

Básico
go run .

# Executar pacote atual

Básico
go run cmd/myapp/main.go

# Executar aplicação específica

Básico
go build

# Compilar para binário

Básico
go build -o myapp

# Compilar com nome customizado

Básico
go build -o myapp main.go

# Compilar arquivo específico

Básico
go install

# Compilar e instalar em GOPATH/bin

Básico
go clean

# Limpar arquivos de build

📋Cross-compilation

Básico
GOOS=linux go build

# Build para Linux

Básico
GOOS=windows go build

# Build para Windows

Básico
GOOS=darwin go build

# Build para macOS

Básico
GOOS=linux GOARCH=arm64 go build

# Build para ARM64

Básico
GOOS=windows GOARCH=amd64 go build

# Build Windows 64-bit

Básico
go build -ldflags="-s -w"

# Build otimizado

Básico
go build -tags netgo -installsuffix netgo

# Build com CGO desabilitado

📋 Variáveis e Tipos

Use quando: Declarando variáveis, trabalhando com tipos básicos, definindo constantes

📋Declaração de Variáveis

Básico
var nome string = "João"

# Declaração completa

Básico
var idade int = 25

# Tipo inteiro

Básico
var altura float64 = 1.75

# Ponto flutuante

Básico
var ativo bool = true

# Booleano

Básico
nome := "Maria"

# Inferência de tipo (short declaration)

Básico
idade := 30

# Inferência para inteiro

Básico
var preco = 19.99

# Inferência sem tipo explícito

Básico
var cidade string

# Declaração sem valor (zero value)

📋Tipos Básicos

Básico
var nome string

# String

Básico
var idade int

# Inteiro

Básico
var preco float64

# Float 64-bit

Básico
var flag bool

# Booleano

Básico
var byteVar byte

# Byte (uint8)

Básico
var runeVar rune

# Rune (int32)

Básico
var erro error

# Tipo error

Básico
var ptr *int

# Ponteiro para inteiro

📋Tipos Numéricos

Básico
var i int

# Inteiro (depende da arquitetura)

Básico
var i8 int8

# Inteiro 8-bit

Básico
var i16 int16

# Inteiro 16-bit

Básico
var i32 int32

# Inteiro 32-bit

Básico
var i64 int64

# Inteiro 64-bit

Básico
var u uint

# Unsigned int

Básico
var u32 uint32

# Unsigned 32-bit

Básico
var u64 uint64

# Unsigned 64-bit

Básico
var f32 float32

# Float 32-bit

Básico
var f64 float64

# Float 64-bit

📋Constantes

Básico
const PI = 3.14159

# Constante numérica

Básico
const nome = "Go"

# Constante string

Básico
const ativo = true

# Constante booleana

Básico
const ( A = 1 B = 2 C = 3 )

# Bloco de constantes

Básico
const ( Segunda = iota Terça Quarta )

# iota (auto-incremento)

🏗️ Estruturas de Dados

Use quando: Trabalhando com coleções de dados, estruturas complexas, armazenamento

📋Arrays

Básico
var numeros [5]int

# Array de 5 inteiros

Básico
numeros := [5]int{1, 2, 3, 4, 5}

# Array com valores

Básico
numeros := [...]int{1, 2, 3, 4, 5}

# Array com tamanho automático

Básico
primeiro := numeros[0]

# Acessar elemento

Básico
len(numeros)

# Tamanho do array

Básico
var matriz [3][4]int

# Array multidimensional

📋Slices

Básico
var slice []int

# Slice vazio

Básico
slice := []int{1, 2, 3, 4, 5}

# Slice com valores

Básico
slice := make([]int, 5)

# Slice com make()

Básico
slice := make([]int, 5, 10)

# Com capacidade

Básico
slice = append(slice, 6)

# Adicionar elemento

Básico
slice = append(slice, 7, 8, 9)

# Adicionar múltiplos

Básico
subslice := slice[1:4]

# Fatiar slice

Básico
subslice := slice[:3]

# Primeiros 3 elementos

Básico
subslice := slice[2:]

# Do 2 até o fim

📋Maps

Básico
var m map[string]int

# Map vazio

Básico
m := make(map[string]int)

# Criar map com make()

Básico
m := map[string]int{"a": 1, "b": 2}

# Map com valores

Básico
m["chave"] = 42

# Adicionar/alterar valor

Básico
valor := m["chave"]

# Acessar valor

Básico
valor, ok := m["chave"]

# Acessar com verificação

Básico
delete(m, "chave")

# Remover chave

Básico
len(m)

# Número de elementos

📋Structs

Básico
type Pessoa struct { Nome string Idade int }

# Definir struct

Básico
p := Pessoa{Nome: "João", Idade: 25}

# Criar instância

Básico
p := Pessoa{"Maria", 30}

# Criar sem nome de campos

Básico
var p Pessoa

# Struct vazia (zero values)

Básico
p.Nome = "Carlos"

# Acessar campo

Básico
nome := p.Nome

# Ler campo

Básico
type Endereco struct { Rua, Cidade string CEP int }

# Campos combinados

🔀 Estruturas de Controle

Use quando: Controlando fluxo do programa, repetições, decisões condicionais

📋If/Else

Básico
if idade >= 18 { fmt.Println("Maior de idade") }

# If simples

Básico
if nota >= 7 { fmt.Println("Aprovado") } else { fmt.Println("Reprovado") }

# If/Else

Básico
if nota >= 7 { fmt.Println("Aprovado") } else if nota >= 5 { fmt.Println("Recuperação") } else { fmt.Println("Reprovado") }

# If/Else If/Else

Básico
if valor := calcular(); valor > 0 { fmt.Println("Positivo:", valor) }

# If com inicialização

📋Loops For

Básico
for i := 0; i < 5; i++ { fmt.Println(i) }

# For tradicional

Básico
for i := 1; i <= 10; i += 2 { fmt.Println(i) }

# For com passo

Básico
i := 0 for i < 5 { fmt.Println(i) i++ }

# For como while

Básico
slice := []int{1, 2, 3} for i, valor := range slice { fmt.Println(i, valor) }

# Range em slice

Básico
m := map[string]int{"a": 1, "b": 2} for chave, valor := range m { fmt.Println(chave, valor) }

# Range em map

Básico
for i := range 5 { fmt.Println(i) }

# Range simples

Básico
for { // loop infinito }

# Loop infinito

📋Switch

Básico
switch dia { case "segunda": fmt.Println("Início da semana") case "sexta": fmt.Println("Final da semana") default: fmt.Println("Meio da semana") }

# Switch básico

Básico
switch nota { case 10: fmt.Println("Perfeito") case 9, 8: fmt.Println("Ótimo") case 7, 6: fmt.Println("Bom") default: fmt.Println("Precisa melhorar") }

# Múltiplos casos

Básico
x := 10 switch { case x > 10: fmt.Println("Maior que 10") case x == 10: fmt.Println("Igual a 10") default: fmt.Println("Menor que 10") }

# Switch sem expressão

📋Break e Continue

Básico
for i := 0; i < 10; i++ { if i == 5 { continue } fmt.Println(i) }

# Continue - pular iteração

Básico
for i := 0; i < 10; i++ { if i == 7 { break } fmt.Println(i) }

# Break - sair do loop

Básico
Loop: for i := 0; i < 3; i++ { for j := 0; j < 3; j++ { if i == j { break Loop } fmt.Println(i, j) } }

# Break com label

⚡ Funções

Use quando: Reutilizando código, organização lógica, modularização, closures

📋Funções Básicas

Intermediário
func saudar(nome string) { fmt.Println("Olá,", nome) }

# Função simples

Intermediário
func soma(a, b int) int { return a + b }

# Função com retorno

Intermediário
func calcula(base, altura float64) (float64, float64) { area := base * altura perimetro := 2 * (base + altura) return area, perimetro }

# Múltiplos retornos

Intermediário
func saudar(nome string, idade ...int) { fmt.Println("Olá,", nome) for _, i := range idade { fmt.Println(i) } }

# Variadic arguments

📋Funções Anônimas

Intermediário
soma := func(a, b int) int { return a + b } resultado := soma(3, 4)

# Função anônima

Intermediário
func executor(f func(int) int, valor int) { fmt.Println(f(valor)) } quadrado := func(x int) int { return x * x } executor(quadrado, 5)

# Função como parâmetro

Intermediário
func() { fmt.Println("Executando imediatamente") }()

# IIFE (Immediately Invoked)

📋Closures

Intermediário
func contador() func() int { i := 0 return func() int { i++ return i } } c := contador() fmt.Println(c()) // 1 fmt.Println(c()) // 2

# Closure simples

Intermediário
func multiplicador(fator int) func(int) int { return func(x int) int { return x * fator } } dobrar := multiplicador(2) triplicar := multiplicador(3)

# Closure factory

📋Recursão

Intermediário
func fatorial(n int) int { if n <= 1 { return 1 } return n * fatorial(n-1) }

# Função recursiva

Intermediário
func fibonacci(n int) int { if n <= 1 { return n } return fibonacci(n-1) + fibonacci(n-2) }

# Fibonacci recursivo

Intermediário
func fibonacciIterativo(n int) int { a, b := 0, 1 for i := 0; i < n; i++ { a, b = b, a+b } return a }

# Versão iterativa (mais eficiente)

🔧 Métodos e Interfaces

Use quando: Polimorfismo, abstração, padrões de projeto, design flexível

📋Métodos

Intermediário
type Retangulo struct { Largura, Altura float64 } func (r Retangulo) Area() float64 { return r.Largura * r.Altura }

# Método em struct

Intermediário
func (r *Retangulo) SetLargura(l float64) { r.Largura = l }

# Método com ponteiro

Intermediário
type Celsius float64 func (c Celsius) Fahrenheit() float64 { return float64(c)*9/5 + 32 }

# Método em tipo básico

Intermediário
type Contador int func (c *Contador) Incrementar() { *c++ }

# Método em tipo customizado

📋Interfaces

Intermediário
type Forma interface { Area() float64 Perimetro() float64 }

# Definir interface

Intermediário
type Escritor interface { Escrever() error } type Arquivo struct{} func (a Arquivo) Escrever() error { // implementação return nil }

# Implementar interface

Intermediário
type InterfaceVazia interface{} func QualquerCoisa(valor interface{}) { // aceita qualquer tipo }

# Interface vazia (any)

Intermediário
var w Escritor = Arquivo{} w.Escrever()

# Usar interface

📋Type Assertions

Intermediário
var x interface{} = "hello" if s, ok := x.(string); ok { fmt.Println("String:", s) }

# Type assertion com verificação

Intermediário
valor := x.(string)

# Type assertion direto (pode panicar)

Intermediário
switch v := x.(type) { case string: fmt.Println("String:", v) case int: fmt.Println("Int:", v) default: fmt.Println("Tipo desconhecido") }

# Type switch

📋Interfaces Comuns

Intermediário
type Stringer interface { String() string }

# Interface Stringer

Intermediário
type Error interface { Error() string }

# Interface Error

Intermediário
func (e ErroCustom) Error() string { return "Erro: " + e.mensagem }

# Implementar Error

Intermediário
fmt.Println(erroCustom)

# Print chama String() ou Error()

🚀 Goroutines e Canais

Use quando: Processamento concorrente, paralelismo, comunicação entre goroutines

📋Goroutines

Intermediário
go func() { fmt.Println("Executando em goroutine") }()

# Goroutine anônima

Intermediário
func tarefa(id int) { fmt.Println("Tarefa", id) } for i := 0; i < 3; i++ { go tarefa(i) }

# Múltiplas goroutines

Intermediário
func tarefaLonga() { time.Sleep(2 * time.Second) fmt.Println("Pronto") } fmt.Println("Iniciando") go tarefaLonga() fmt.Println("Continuando") time.Sleep(3 * time.Second)

# Goroutine com delay

Intermediário
var wg sync.WaitGroup for i := 0; i < 3; i++ { wg.Add(1) go func(id int) { defer wg.Done() fmt.Println("Tarefa", id) }(i) } wg.Wait()

# WaitGroup para sincronização

📋Canais Básicos

Intermediário
ch := make(chan int)

# Criar canal

Intermediário
ch <- 42

# Enviar para canal

Intermediário
valor := <-ch

# Receber do canal

Intermediário
ch := make(chan string, 10)

# Canal com buffer

Intermediário
close(ch)

# Fechar canal

Intermediário
valor, ok := <-ch

# Receber com verificação

📋Select

Intermediário
select { case msg1 := <-ch1: fmt.Println("Recebido:", msg1) case msg2 := <-ch2: fmt.Println("Recebido:", msg2) case ch3 <- mensagem: fmt.Println("Enviado") default: fmt.Println("Nenhum canal pronto") }

# Select com múltiplos casos

Intermediário
select { case <-time.After(2 * time.Second): fmt.Println("Timeout") case valor := <-ch: fmt.Println("Recebido:", valor) }

# Select com timeout

Intermediário
ticker := time.NewTicker(1 * time.Second) for { select { case <-ticker.C: fmt.Println("Tick") case <-done: return } }

Select com ticker

📋Padrões de Concorrência

Intermediário
func worker(jobs <-chan int, results chan<- int) { for j := range jobs { results <- j * 2 } }

# Worker pool pattern

Intermediário
jobs := make(chan int, 100) results := make(chan int, 100) for w := 0; w < 3; w++ { go worker(jobs, results) } for j := 0; j < 5; j++ { jobs <- j } close(jobs)

# Usando worker pool

Intermediário
func fanIn(input1, input2 <-chan string) <-chan string { output := make(chan string) go func() { for { select { case s := <-input1: output <- s case s := <-input2: output <- s } } }() return output }

# Fan-in pattern

⚠️ Error Handling

Use quando: Tratamento de erros robusto, validação, recuperação de panics

📋Errors Básicos

Intermediário
func dividir(a, b float64) (float64, error) { if b == 0 { return 0, errors.New("divisão por zero") } return a / b, nil }

# Função que retorna error

Intermediário
resultado, err := dividir(10, 0) if err != nil { fmt.Println("Erro:", err) return } fmt.Println("Resultado:", resultado)

# Tratamento de error

Intermediário
import "errors" err := errors.New("erro customizado")

# Criar error simples

Intermediário
err := fmt.Errorf("valor %d inválido", valor)

# Error formatado

📋Errors Customizados

Intermediário
type ErroValidacao struct { Campo string Valor interface{} } func (e ErroValidacao) Error() string { return fmt.Sprintf("campo %s inválido: %v", e.Campo, e.Valor) }

# Struct de error customizado

Intermediário
type ErroNegocio struct { Code int Message string } func (e ErroNegocio) Error() string { return fmt.Sprintf("Erro %d: %s", e.Code, e.Message) }

# Error de negócio

Intermediário
func validarIdade(idade int) error { if idade < 0 { return ErroValidacao{"idade", idade} } return nil }

# Usar error customizado

📋Wrapping Errors

Intermediário
func processarArquivo(arquivo string) error { data, err := os.ReadFile(arquivo) if err != nil { return fmt.Errorf("falha ao ler arquivo %s: %w", arquivo, err) } // processar data return nil }

# Error wrapping

Intermediário
err := processarArquivo("dados.txt") if err != nil { if errors.Is(err, os.ErrNotExist) { fmt.Println("Arquivo não existe") } else { fmt.Println("Outro erro:", err) } }

# Verificar error com errors.Is

Intermediário
var pathError *os.PathError if errors.As(err, &pathError) { fmt.Println("Erro de caminho:", pathError.Path) }

Extrair tipo específico com errors.As

📋Panic e Recover

Intermediário
panic("algo deu muito errado!")

# Disparar panic

Intermediário
func dangerous() { defer func() { if r := recover(); r != nil { fmt.Println("Recuperado do panic:", r) } }() panic("problema!") }

# Recover de panic

Intermediário
func devePanic(t *testing.T) { defer func() { if r := recover(); r == nil { t.Errorf("Esperava panic") } }() funcaoQueDevePanicar() }

# Testar panic em unit tests

🧪 Testing

Use quando: Desenvolvimento orientado a testes, garantia de qualidade, regressão

📋Testes Básicos

Intermediário
func TestSoma(t *testing.T) { resultado := soma(2, 3) esperado := 5 if resultado != esperado { t.Errorf("soma(2, 3) = %d; esperado %d", resultado, esperado) } }

# Teste básico

Intermediário
go test

# Executar todos os testes

Intermediário
go test -v

# Executar com verbosidade

Intermediário
go test -run TestSoma

# Executar teste específico

Intermediário
go test ./...

# Executar testes em todos os pacotes

📋Assertions

Intermediário
func TestDivisao(t *testing.T) { t.Run("divisão normal", func(t *testing.T) { resultado, err := dividir(10, 2) if resultado != 5 { t.Errorf("Esperado 5, obteve %f", resultado) } if err != nil { t.Errorf("Não deveria ter erro: %v", err) } }) }

# Subtestes

Intermediário
if !reflect.DeepEqual(resultado, esperado) { t.Errorf("Resultados diferentes") }

# Comparar structs complexas

Intermediário
if len(slices) != 3 { t.Errorf("Esperado 3 elementos, obteve %d", len(slices)) }

# Verificar tamanho

📋Teste de Erros

Intermediário
func TestDivisaoPorZero(t *testing.T) { _, err := dividir(10, 0) if err == nil { t.Error("Esperava erro de divisão por zero") } if err.Error() != "divisão por zero" { t.Errorf("Mensagem de erro inesperada: %s", err.Error()) } }

# Testar erro

Intermediário
func TestErroCustomizado(t *testing.T) { err := processar(-1) var erroValidacao ErroValidacao if !errors.As(err, &erroValidacao) { t.Errorf("Esperava ErroValidacao, obteve %T", err) } }

# Testar error customizado

📋Benchmark

Intermediário
func BenchmarkSoma(b *testing.B) { for i := 0; i < b.N; i++ { soma(100, 200) } }

# Benchmark de performance

Intermediário
go test -bench=.

# Executar benchmarks

Intermediário
go test -bench=BenchmarkSoma -benchmem

# Benchmark com memória

Intermediário
go test -bench=. -cpuprofile=cpu.prof

# Profile de CPU

Intermediário
go test -bench=. -memprofile=mem.prof

# Profile de memória

📋Table-driven Tests

Intermediário
func TestCalculadora(t *testing.T) { casos := []struct { nome string a, b int esperado int }{ {"soma positiva", 2, 3, 5}, {"soma negativa", -2, -3, -5}, {"soma zero", 0, 5, 5}, } for _, c := range casos { t.Run(c.nome, func(t *testing.T) { resultado := soma(c.a, c.b) if resultado != c.esperado { t.Errorf("%s: soma(%d, %d) = %d; esperado %d", c.nome, c.a, c.b, resultado, c.esperado) } }) } }

# Table-driven test

⏱️ Context e Cancelamento

Use quando: Operações longas, cancelamento propagação, timeouts em APIs

📋Context Básico

Avançado
import "context" ctx := context.Background()

# Context raiz

Avançado
ctx := context.TODO()

# Context placeholder

Avançado
ctx, cancel := context.WithCancel(context.Background()) defer cancel()

# Context com cancelamento

Avançado
ctx := context.WithValue(context.Background(), "userID", 123)

# Context com valores

📋Timeout

Avançado
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() select { case <-ctx.Done(): fmt.Println("Timeout:", ctx.Err()) case resultado := <-longaOperacao(): fmt.Println("Sucesso:", resultado) }

# Context com timeout

Avançado
func operacaoLonga(ctx context.Context) error { select { case <-time.After(10 * time.Second): return nil case <-ctx.Done(): return ctx.Err() } }

# Função que respeita context

📋Cancelamento

Avançado
ctx, cancel := context.WithCancel(context.Background()) go func() { time.Sleep(2 * time.Second) cancel() // cancela após 2 segundos }() select { case <-ctx.Done(): fmt.Println("Cancelado:", ctx.Err()) }

# Cancelamento manual

Avançado
func worker(ctx context.Context) { for { select { case <-ctx.Done(): fmt.Println("Worker encerrado") return default: // fazer trabalho time.Sleep(100 * time.Millisecond) } } }

# Worker com cancelamento

📋Propagação de Context

Avançado
func handler(ctx context.Context) error { ctx = context.WithValue(ctx, "requestID", "12345") return servico(ctx) } func servico(ctx context.Context) error { requestID := ctx.Value("requestID").(string) fmt.Println("Request ID:", requestID) return nil }

# Propagar valores

Avançado
func servidorHTTP(w http.ResponseWriter, r *http.Request) { ctx := r.Context() ctx = context.WithValue(ctx, "userID", getUserID(r)) processarRequisicao(ctx) }

# Context em HTTP

📋Deadline

Avançado
ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(5*time.Second)) defer cancel()

# Context com deadline

Avançado
if deadline, ok := ctx.Deadline(); ok { fmt.Println("Deadline:", deadline) tempoRestante := time.Until(deadline) fmt.Println("Tempo restante:", tempoRestante) }

# Verificar deadline

Avançado
func tarefaComDeadline(ctx context.Context) error { if deadline, ok := ctx.Deadline(); ok { fmt.Println("Precisa terminar antes:", deadline) } // executar tarefa return nil }

# Tarefa com deadline

🔍 Reflection e Generics

Use quando: Frameworks, bibliotecas genéricas, metaprogramação, serialização

📋Reflection Básica

Avançado
import "reflect" x := 42 tipo := reflect.TypeOf(x) valor := reflect.ValueOf(x) fmt.Println("Tipo:", tipo) fmt.Println("Valor:", valor)

# Type e Value

Avançado
var i int = 42 v := reflect.ValueOf(i) if v.Kind() == reflect.Int { fmt.Println("É um inteiro") }

# Verificar kind

Avançado
pessoa := Pessoa{Nome: "João", Idade: 25} v := reflect.ValueOf(pessoa) campo := v.FieldByName("Nome") fmt.Println("Nome:", campo.String())

# Acessar campos

📋Modificação com Reflection

Avançado
x := 42 v := reflect.ValueOf(&x).Elem() if v.CanSet() { v.SetInt(100) fmt.Println("x agora é:", x) }

# Modificar valor

Avançado
slice := []int{1, 2, 3} v := reflect.ValueOf(slice) v.SetLen(5) fmt.Println("Novo tamanho:", len(slice))

# Modificar slice

Avançado
m := make(map[string]int) v := reflect.ValueOf(m) v.SetMapIndex(reflect.ValueOf("chave"), reflect.ValueOf(42))

# Modificar map

📋Generics

Avançado
func Generico[T any](valor T) T { return valor }

# Função genérica simples

Avançado
type Pilha[T any] struct { elementos []T } func (p *Pilha[T]) Push(elemento T) { p.elementos = append(p.elementos, elemento) } func (p *Pilha[T]) Pop() T { ultimo := p.elementos[len(p.elementos)-1] p.elementos = p.elementos[:len(p.elementos)-1] return ultimo }

# Struct genérica

Avançado
func Maior[T constraints.Ordered](a, b T) T { if a > b { return a } return b }

# Generics com constraints

📋Interfaces Genéricas

Avançado
type Container[T any] interface { Add(T) Get() T }

# Interface genérica

Avançado
type Comparavel interface { Compare(outro interface{}) int } func Max[T Comparavel](slice []T) T { max := slice[0] for _, v := range slice[1:] { if v.Compare(max) > 0 { max = v } } return max }

# Interface com generics

📋Reflection e Generics

Avançado
func ImprimirTipo[T any](valor T) { t := reflect.TypeOf(valor) v := reflect.ValueOf(valor) fmt.Printf("Tipo: %s, Valor: %v\n", t, v) }

# Reflection em genéricos

Avançado
func CriarSlice[T any](tipo T, tamanho int) []T { t := reflect.TypeOf(tipo) slice := reflect.MakeSlice(reflect.SliceOf(t), tamanho, tamanho) return slice.Interface().([]T) }

# Criar slices dinamicamente

🏗️ Build e Deployment

Use quando: Produção, CI/CD, Docker, deployment em diferentes plataformas

📋Build Options

Avançado
go build -ldflags="-s -w"

# Strip symbols (binário menor)

Avançado
go build -ldflags="-X main.Version=1.0.0"

# Injetar variáveis

Avançado
go build -tags "production"

# Build tags

Avançado
go build -race

# Detector de race conditions

Avançado
go build -gcflags="-m"

# Mostrar optimizations do compilador

Avançado
go build -asmflags="-I ."

# Flags para assembler

📋Cross-compilation

Avançado
GOOS=linux GOARCH=amd64 go build

# Linux 64-bit

Avançado
GOOS=windows GOARCH=amd64 go build -o app.exe

# Windows 64-bit

Avançado
GOOS=darwin GOARCH=amd64 go build

# macOS Intel

Avançado
GOOS=darwin GOARCH=arm64 go build

# macOS Apple Silicon

Avançado
GOOS=linux GOARCH=arm64 go build

# Linux ARM64

Avançado
GOOS=freebsd GOARCH=amd64 go build

# FreeBSD

📋Docker

Avançado
# Multi-stage build FROM golang:1.21-alpine AS builder WORKDIR /app COPY . . RUN go build -o main . FROM alpine:latest RUN apk --no-cache add ca-certificates WORKDIR /root/ COPY --from=builder /app/main . CMD ["./main"]

# Docker multi-stage

Avançado
FROM golang:1.21-alpine AS builder RUN go mod download COPY . . RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o main .

# Build para Alpine

📋CI/CD

Avançado
name: Test and Build on: [push, pull_request] jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - uses: actions/setup-go@v4 with: go-version: '1.21' - run: go test ./...

# GitHub Actions

Avançado
build: stage: build image: golang:1.21 script: - go mod download - go build -o app artifacts: paths: - app

# GitLab CI

Avançado
pipeline: agent: docker: image: golang:1.21 steps: - checkout - task: Test script: - go test ./...

# Bamboo

📋Deployment

Avançado
systemctl start myapp.service

# Systemd service

Avançado
docker-compose up -d

# Docker Compose

Avançado
kubectl apply -f deployment.yaml

# Kubernetes

Avançado
docker build -t myapp:latest .

# Docker image

Avançado
docker push registry.com/myapp:latest

# Push para registry

🤝 Contribuindo

Encontrou um erro? Quer melhorar um cheatsheet? Tem uma sugestão? Adoraríamos suas contribuições! Abra uma issue ou submeta um PR.

Gostou do projeto? Apoie o desenvolvimento com um café e ajude a manter tudo open source ☕