Cheatsheet Go: Sintaxe Básica

Este cheatsheet é a cola rápida da sintaxe Go em português: variáveis, tipos, operadores, if/for, funções, ponteiros e defer, com exemplos prontos para copiar. Use a tabela abaixo para achar a forma e os programas completos de cada seção para testar. Para um tutorial passo a passo, veja Go para Iniciantes ou Primeiros Passos com Go.

Cola rápida de sintaxe Go

Os fragmentos desta tabela pressupõem que as variáveis e funções usadas já existem; os exemplos completos aparecem nas seções correspondentes.

Quero…Sintaxe para consultarReferência
Declarar uma variável dentro de uma funçãonome := "Ana"Variáveis
Declarar com tipo e valor zerovar total intVariáveis
Definir uma constanteconst porta = 8080Constantes
Converter um número explicitamentefloat64(total)Conversões
Comparar e combinar condiçõestotal > 0 && ativoOperadores
Tratar um erroif err != nil { return err }Controle de fluxo
Repetir com contadorfor i := 0; i < 3; i++ { fmt.Println(i) }For
Percorrer um slicefor i, v := range valores { fmt.Println(i, v) }For
Declarar uma funçãofunc soma(a, b int) int { return a + b }Funções
Acessar um valor por ponteirop := &total; *p = 10Ponteiros
Adiar o fechamento de um arquivodefer f.Close()Defer

Para estruturas de dados e concorrência, consulte os cheatsheets de slices, maps e structs e goroutines e channels.


Variáveis

FormaSintaxeOnde funciona
Declaração explícitavar nome string = "Ana"Qualquer escopo
Tipo inferidovar idade = 30Qualquer escopo
Declaração curtanome := "Ana"Apenas dentro de funções
Múltiplasvar a, b int = 1, 2Qualquer escopo
Bloco varvar ( ... )Qualquer escopo
Zero valuevar x int → 0Qualquer escopo
package main

import "fmt"

func main() {
	// Declaração curta (mais comum)
	nome := "Go"
	versao := 1.26

	// Declaração explícita
	var ativo bool = true

	// Bloco de variáveis
	var (
		host  string = "localhost"
		porta int    = 8080
	)

	fmt.Println(nome, versao, ativo, host, porta)
}

O zero value é o valor padrão de cada tipo: 0 para numéricos, "" para strings, false para bool e nil para ponteiros, slices, maps, channels e interfaces. Veja a regra de inicialização na especificação.


Constantes

package main

import "fmt"

const Pi = 3.14159

const (
	StatusOK       = 200
	StatusNotFound = 404
)

// iota: enumerador auto-incrementado
const (
	Domingo = iota // 0
	Segunda        // 1
	Terca          // 2
	Quarta         // 3
)

func main() {
	fmt.Println(Pi, StatusOK, Domingo, Segunda)
}

Constantes em Go são avaliadas em tempo de compilação. Veja constantes na especificação para mais detalhes.


Tipos de Dados

Tipos Numéricos

TipoTamanhoFaixa
int88 bits-128 a 127
int1616 bits-32.768 a 32.767
int3232 bits-2³¹ a 2³¹-1
int6464 bits-2⁶³ a 2⁶³-1
int32 ou 64 bitsDepende da plataforma
uint8 (byte)8 bits0 a 255
uint1616 bits0 a 65.535
uint3232 bits0 a 2³²-1
uint6464 bits0 a 2⁶⁴-1
float3232 bitsIEEE-754
float6464 bitsIEEE-754
complex6464 bitsfloat32 + float32
complex128128 bitsfloat64 + float64

Outros Tipos Básicos

TipoDescrição
booltrue ou false
stringSequência imutável de bytes; não necessariamente UTF-8 válido
byteAlias para uint8
runeAlias para int32, representa um code point Unicode

Veja mais sobre runes e tipos numéricos e strings na especificação. As faixas numéricas e a definição de string seguem a especificação oficial de tipos Go.

Conversões explícitas

Go não converte automaticamente uma variável int em float64. Use T(valor) para uma conversão permitida entre tipos. Para obter uma divisão fracionária de dois inteiros, converta antes de dividir:

package main

import "fmt"

func main() {
	a, b := 10, 3
	fmt.Println(a / b)                   // 3: divisão inteira
	fmt.Println(float64(a) / float64(b)) // 3.3333333333333335
	fmt.Println(float64(a / b))          // 3: a parte fracionária já foi perdida
}

Converter um número para string não é o mesmo que formatá-lo em decimal: para isso, use strconv.Itoa ou fmt.Sprintf, como no cheatsheet de strings e formatação. Referências: conversões e operadores aritméticos.


Operadores

Aritméticos

OperadorDescriçãoExemplo
+Soma5 + 3 → 8
-Subtração5 - 3 → 2
*Multiplicação5 * 3 → 15
/Divisão10 / 3 → 3 (inteiros)
%Módulo10 % 3 → 1

Comparação

OperadorDescrição
==Igual
!=Diferente
<, >Menor / Maior
<=, >=Menor ou igual / Maior ou igual

Lógicos

OperadorDescrição
&&E (AND)
||OU (OR)
!NÃO (NOT)

Bitwise

OperadorDescrição
&AND
|OR
^XOR
<<Shift left
>>Shift right
&^AND NOT (bit clear)

Controle de Fluxo

if / else

package main

import "fmt"

func main() {
	x := 42

	if x > 0 {
		fmt.Println("positivo")
	} else if x < 0 {
		fmt.Println("negativo")
	} else {
		fmt.Println("zero")
	}

	// if com inicialização (idiomático em Go)
	if v := calcular(); v > 100 {
		fmt.Println("acima de 100:", v)
	}
}

func calcular() int { return 150 }

O padrão if err != nil é a base do tratamento de erros em Go. Veja também os erros comuns para referência.

switch

package main

import "fmt"

func main() {
	dia := "terça"

	switch dia {
	case "segunda", "terça", "quarta", "quinta", "sexta":
		fmt.Println("dia útil")
	case "sábado", "domingo":
		fmt.Println("fim de semana")
	default:
		fmt.Println("dia inválido")
	}

	// Switch sem expressão (substitui if/else if)
	nota := 85
	switch {
	case nota >= 90:
		fmt.Println("A")
	case nota >= 80:
		fmt.Println("B")
	case nota >= 70:
		fmt.Println("C")
	default:
		fmt.Println("F")
	}
}

Em Go, cada case tem break implícito. Use fallthrough se precisar continuar para o próximo case.

for (o único loop)

package main

import "fmt"

func main() {
	// for clássico
	for i := 0; i < 5; i++ {
		fmt.Print(i, " ")
	}

	// estilo "while"
	n := 1
	for n < 100 {
		n *= 2
	}

	// loop infinito
	// for { break }

	// range sobre slice
	frutas := []string{"maçã", "banana", "uva"}
	for i, fruta := range frutas {
		fmt.Printf("%d: %s\n", i, fruta)
	}

	// range ignorando índice
	for _, fruta := range frutas {
		fmt.Println(fruta)
	}
}

Para iterar sobre maps e channels, veja o cheatsheet de slices, maps e structs e o cheatsheet de concorrência.


Funções

package main

import (
	"errors"
	"fmt"
)

// Função simples
func soma(a, b int) int {
	return a + b
}

// Múltiplos retornos (idiomático para erros)
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 limites(nums []int) (min, max int) {
	min, max = nums[0], nums[0]
	for _, n := range nums {
		if n < min {
			min = n
		}
		if n > max {
			max = n
		}
	}
	return
}

// Variadic (número variável de argumentos)
func somaAll(nums ...int) int {
	total := 0
	for _, n := range nums {
		total += n
	}
	return total
}

// Função como valor
var dobro = func(x int) int { return x * 2 }

func main() {
	fmt.Println(soma(3, 4))
	fmt.Println(divide(10, 3))
	fmt.Println(limites([]int{3, 1, 4, 1, 5}))
	fmt.Println(somaAll(1, 2, 3, 4, 5))
	fmt.Println(dobro(21))
}

Funções em Go são cidadãs de primeira classe — podem ser atribuídas a variáveis, passadas como argumentos e retornadas de outras funções. Veja tipos de função na especificação.


Ponteiros

package main

import "fmt"

func main() {
	x := 42
	p := &x    // p é um ponteiro para x
	fmt.Println(*p)  // 42 — desreferencia o ponteiro
	*p = 100
	fmt.Println(x)   // 100 — x foi alterado via ponteiro
}

func incrementar(val *int) {
	*val++
}
OperaçãoSintaxeDescrição
Endereço&xObtém ponteiro para x
Desreferência*pAcessa valor apontado
Tipo ponteiro*intPonteiro para int
Zero valuenilPonteiro não inicializado

Cuidado com o nil pointer dereference — um dos erros mais comuns em Go. Veja também tipos de ponteiro na especificação.


Defer

package main

import (
	"fmt"
	"os"
)

func main() {
	f, err := os.Open("arquivo.txt")
	if err != nil {
		fmt.Println(err)
		return
	}
	defer f.Close() // executa quando main() retorna

	// usar f normalmente...
}

defer empilha chamadas (LIFO) e é essencial para liberar recursos. Veja defer na especificação e panic/recover para tratamento avançado.


Pacotes e Imports

package main

import (
	"fmt"
	"math"
	"strings"
)

func main() {
	fmt.Println(math.Sqrt(16))
	fmt.Println(strings.ToUpper("hello"))
}
SintaxeDescrição
import "fmt"Import simples
import ( ... )Import agrupado
import . "fmt"Importa tudo para o escopo atual
import _ "pkg"Importa apenas pelo side effect (init)
import alias "pkg"Importa com alias

Variáveis locais e imports não usados causam erro de compilação; funções e variáveis no nível do pacote podem existir sem ser usadas. Veja declared and not used e undefined variable.

Para gerenciar dependências, veja o guia de Go Modules e Go Modules na prática. Se quiser comparar a sintaxe de Go com outras linguagens de sistemas, confira os guias de Rust e Zig.


Armadilhas comuns da sintaxe

SituaçãoRegra práticaFonte oficial
x := 1 seguido de x := 2 no mesmo blocoUse x = 2: := exige pelo menos uma variável nova que não seja _; um bloco interno pode declarar outro x e ocultar o externo.Declaração curta
Somar variáveis int e int64Faça uma conversão explícita, como int64(x) + y; considere a faixa do tipo de destino.Operadores
Chamar limites com slice vazioO exemplo acima exige ao menos um elemento: nums[0] causa panic se len(nums) == 0. Valide a entrada antes da chamada.Indexação
Desreferenciar um ponteiro nilVerifique o ponteiro antes de acessar *p; a desreferência de nil causa panic.Operadores de endereço
Esperar que defer execute ao sair de um ifA chamada ocorre quando a função retorna, não quando o bloco termina; seus argumentos são avaliados no momento do defer.Defer

Fontes oficiais para conferir a sintaxe

Veja Também