Go Cheatsheet
Referência rápida de sintaxe Go. Copie e cole.
Hello World
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
Variáveis
// Declaração explícita
var nome string = "João"
var idade int = 30
// Declaração curta (dentro de funções)
nome := "João"
idade := 30
// Múltiplas variáveis
var a, b, c int = 1, 2, 3
x, y := 10, 20
// Constantes
const Pi = 3.14159
Tipos Básicos
// Números
int, int8, int16, int32, int64
uint, uint8, uint16, uint32, uint64
float32, float64
complex64, complex128
// Texto
string
byte // alias para uint8
rune // alias para int32 (Unicode)
// Booleano
bool // true, false
Funções
// Função simples
func soma(a, b int) int {
return a + b
}
// Múltiplos retornos
func divide(a, b float64) (float64, error) {
if b == 0 {
return 0, errors.New("divisão por zero")
}
return a / b, nil
}
// Retornos nomeados
func minMax(nums []int) (min, max int) {
min, max = nums[0], nums[0]
// ...
return // retorna min e max
}
Arrays e Slices
// Array (tamanho fixo)
var arr [5]int
arr := [3]string{"a", "b", "c"}
// Slice (tamanho dinâmico)
slice := []int{1, 2, 3}
slice = append(slice, 4, 5)
// Make (pré-aloca capacidade)
s := make([]int, 0, 10)
// Operações
len(slice) // tamanho
cap(slice) // capacidade
slice[1:3] // sub-slice
copy(dst, src) // copia
Maps
// Criar map
m := make(map[string]int)
m := map[string]int{"a": 1, "b": 2}
// Operações
m["key"] = 42 // set
value := m["key"] // get
value, ok := m["key"] // get + check
delete(m, "key") // delete
// Iterar
for key, value := range m {
fmt.Println(key, value)
}
Structs
// Definir struct
type Pessoa struct {
Nome string
Idade int
}
// Criar instância
p := Pessoa{Nome: "Ana", Idade: 25}
p := Pessoa{"Ana", 25}
// Acessar campos
fmt.Println(p.Nome)
p.Idade = 26
// Ponteiro para struct
pp := &Pessoa{Nome: "Bob"}
pp.Nome = "Roberto" // Go desreferencia
Métodos
type Retangulo struct {
Largura, Altura float64
}
// Método com receiver por valor
func (r Retangulo) Area() float64 {
return r.Largura * r.Altura
}
// Método com receiver por ponteiro
func (r *Retangulo) Escalar(fator float64) {
r.Largura *= fator
r.Altura *= fator
}
Interfaces
// Definir interface
type Forma interface {
Area() float64
Perimetro() float64
}
// Implementação implícita
// (basta ter os métodos)
type Circulo struct {
Raio float64
}
func (c Circulo) Area() float64 {
return math.Pi * c.Raio * c.Raio
}
func (c Circulo) Perimetro() float64 {
return 2 * math.Pi * c.Raio
}
// Interface vazia (qualquer tipo)
var x interface{} = 42
Controle de Fluxo
// If/else
if x > 0 {
// ...
} else if x < 0 {
// ...
} else {
// ...
}
// If com inicialização
if err := doSomething(); err != nil {
return err
}
// Switch
switch day {
case "seg", "ter":
// ...
case "sab", "dom":
// ...
default:
// ...
}
// Switch sem expressão
switch {
case x < 0:
// ...
case x > 0:
// ...
}
Loops
// For clássico
for i := 0; i < 10; i++ {
fmt.Println(i)
}
// While (não existe, usa for)
for condition {
// ...
}
// Infinito
for {
// break para sair
}
// Range (arrays, slices, maps)
for i, v := range slice {
fmt.Println(i, v)
}
// Só valores
for _, v := range slice {}
// Só índices
for i := range slice {}
Goroutines
// Iniciar goroutine
go minhaFuncao()
go func() {
// goroutine anônima
}()
// Esperar goroutines (WaitGroup)
var wg sync.WaitGroup
for i := 0; i < 5; i++ {
wg.Add(1)
go func(n int) {
defer wg.Done()
// trabalho
}(i)
}
wg.Wait()
Channels
// Criar channel
ch := make(chan int) // sem buffer
ch := make(chan int, 10) // com buffer
// Enviar e receber
ch <- 42 // envia
valor := <-ch // recebe
// Channel só leitura/escrita
func produtor(ch chan<- int) {}
func consumidor(ch <-chan int) {}
// Fechar channel
close(ch)
// Select (múltiplos channels)
select {
case v := <-ch1:
// ...
case ch2 <- x:
// ...
default:
// não bloqueia
}
Erros
// Retornar erro
func divide(a, b float64) (float64, error) {
if b == 0 {
return 0, errors.New("divisão por zero")
}
return a / b, nil
}
// Checar erro
result, err := divide(10, 0)
if err != nil {
log.Fatal(err)
}
// Erro customizado
type MeuErro struct {
Msg string
}
func (e MeuErro) Error() string {
return e.Msg
}
// Wrap errors (Go 1.13+)
fmt.Errorf("falha: %w", err)
Defer, Panic, Recover
// Defer (executa no fim da função)
func exemplo() {
defer fmt.Println("fim")
fmt.Println("início")
}
// Saída: início, fim
// Panic (erro fatal)
panic("algo deu muito errado")
// Recover (captura panic)
func seguro() {
defer func() {
if r := recover(); r != nil {
fmt.Println("Recuperado:", r)
}
}()
panic("boom")
}
HTTP Server
package main
import (
"fmt"
"net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Olá, %s!", r.URL.Path[1:])
}
func main() {
http.HandleFunc("/", handler)
http.ListenAndServe(":8080", nil)
}
JSON
import "encoding/json"
type Pessoa struct {
Nome string `json:"nome"`
Idade int `json:"idade,omitempty"`
}
// Encode (struct -> JSON)
p := Pessoa{Nome: "Ana", Idade: 25}
data, _ := json.Marshal(p)
// {"nome":"Ana","idade":25}
// Decode (JSON -> struct)
var p2 Pessoa
json.Unmarshal(data, &p2)
Testes
// arquivo: soma_test.go
package main
import "testing"
func TestSoma(t *testing.T) {
resultado := Soma(2, 3)
esperado := 5
if resultado != esperado {
t.Errorf("Soma(2,3) = %d; esperado %d",
resultado, esperado)
}
}
// Rodar testes
// go test
// go test -v
// go test -cover
Módulos
# Iniciar módulo
go mod init github.com/user/projeto
# Adicionar dependência
go get github.com/pkg/errors
# Atualizar dependências
go mod tidy
# Listar dependências
go list -m all
# Arquivos
go.mod # define módulo e deps
go.sum # checksums
Comandos Úteis
# Compilar e rodar
go run main.go
# Compilar binário
go build -o app main.go
# Formatar código
go fmt ./...
gofmt -w .
# Verificar problemas
go vet ./...
# Documentação local
go doc fmt.Println
# Benchmark
go test -bench=.