Variáveis, Constantes e Escopo
Go oferece várias maneiras de introduzir nomes, cada uma com regras de escopo e restrições de tempo de compilação diferentes.
Busque em todas as páginas da documentação
Go oferece várias maneiras de introduzir nomes, cada uma com regras de escopo e restrições de tempo de compilação diferentes.
Saber qual forma usar mantém o código legível e evita bugs sutis de fechamento de loop.
Variáveis armazenam valores em tempo de execução; constantes são fixas em tempo de compilação.
Escopo é léxico: blocos internos podem sombrear nomes externos, mas nomes no nível do pacote são visíveis entre arquivos do mesmo pacote.
Declaração curta (:=) é a escolha idiomática dentro de funções, enquanto var e const funcionam no nível do pacote.
iota gera sequências de constantes relacionadas sem numeração manual.
Cartão de referência rápida - pronto para copiar e colar.
package main
import "fmt"
const Version = "1.0.0"
var defaultPort = 8080
func main() {
host := "localhost"
port := defaultPort
fmt.Println(host, port, Version)
}Quando usar isso:
:= para locais dentro de funções quando a inferência de tipo for clara.var no nível do pacote ou quando precisar de um valor zero explícito sem atribuição.const para valores que não devem mudar e para enumerações iota.package main
import "fmt"
const (
StatusPending = iota
StatusActive
StatusDone
)
var registry = map[string]int{}
func main() {
for _, name := range []string{"ada", "grace"} {
registry[name] = StatusPending
}
// Armadilha de closure: capture a variável do loop por parâmetro, não por referência.
for _, name := range []string{"ada", "grace"} {
go greet(name)
}
fmt.Println(registry)
}
func greet(name string) {
fmt.Println("hello", name)
}O que isso demonstra:
iota para estados ordenados sem números mágicos.var no nível do pacote para estado mutável compartilhado (use com cuidado).:= local de função dentro de main.name como parâmetro para greet evita o clássico bug de closure de variável de loop.main na ordem de dependência entre pacotes.const devem ser computáveis em tempo de compilação (literais, aritmética em constantes, iota).:= reutiliza nomes no mesmo bloco apenas quando pelo menos um nome à esquerda é novo.| Formulário | Onde | Exemplo | Notas |
|---|---|---|---|
var x T | pacote ou função | var n int | Valor zero se não houver inicializador |
var x = v | pacote ou função | var port = 8080 | Tipo inferido |
x := v | apenas função | host := "local" | Pelo menos um nome novo por bloco |
const x = v | pacote ou função | const Max = 100 | Apenas tempo de compilação |
const ( + iota | pacote ou função | ver Receita | Reinicia por bloco const |
| Escopo | Visível de | Sombreamento |
|---|---|---|
| Pacote | Todos os arquivos no mesmo pacote | Bloco interno pode sombrear nome do pacote |
| Função | Corpo inteiro da função | := em bloco interno cria novo local |
Bloco (if, for) | Apenas corpo do bloco | if x := f(); x != nil limita x ao if |
// iota com máscaras de bits
const (
FlagRead = 1 << iota
FlagWrite
FlagExec
)
// Tipo explícito na primeira const define o tipo para o bloco
const (
KB int = 1 << (10 * iota)
MB
GB
)go func() { fmt.Println(i) }() captura um i mutável. Correção: passe i como parâmetro ou copie i := i dentro do corpo do loop (Go 1.22+ cria variáveis por iteração em for range).:= - x := 1 dentro de um bloco interno esconde o x externo e pode confundir leitores. Correção: use nomes distintos ou atribua x = 1 ao reutilizar a variável externa._ para descartes intencionais.:= no nível do pacote - Declaração curta é ilegal fora de funções. Correção: use var ou const no escopo do pacote.const x = 1). Valores grandes atribuídos a int8 podem truncar silenciosamente em algumas conversões. Correção: use constantes tipadas ou conversão explícita com verificações de limites.| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
Locais := | Maioria dos corpos de função | Declarações no nível do pacote |
var com valor zero | Você precisa explicitamente do valor zero do tipo | Uma simples := com inicializador é mais clara |
const + iota | Enumerações e flags de bits | Valores devem ser computados em tempo de execução |
| Parâmetros de função em vez de globais | Testes e clareza | Caminhos críticos onde o profiling mostra que o custo do parâmetro importa (raro) |
var funciona no escopo do pacote e da função e pode declarar sem inicializador (valor zero).
:= funciona apenas dentro de funções e requer um inicializador enquanto infere o tipo.
Sim, se pelo menos um nome no lado esquerdo for novo.
a, b := 1, 2 então a, c := 3, 4 reutiliza a e declara c.
iota reinicia em 0 no início de cada bloco const ( e incrementa em um para cada linha de especificação de constante, incluindo linhas em branco com _.
Constantes não são armazenamento; são valores de tempo de compilação embutidos ou usados na verificação de tipo.
Atribuir uma const a uma var materializa um valor em tempo de execução.
Locais não utilizados geralmente indicam código morto ou refações incompletas.
O compilador força a remoção para manter binários e revisões limpas.
if err := do(); err != nil {
// err existe apenas nesta cadeia if/else
}A variável declarada no inicializador do if tem escopo para toda a instrução if, incluindo ramos else.
Se o valor nunca muda, prefira const.
Se você precisar de um ponteiro, slice ou mapa mutável, mas a referência for fixa, var é apropriado.
Você pode sombrear um import com uma variável local de mesmo nome em um bloco, o que quebra o acesso ao import dentro desse bloco.
Renomeie imports com import fmt2 "fmt" para evitar colisões.
Cada iteração agora cria suas próprias variáveis de loop, reduzindo bugs de captura de closure.
Ainda passe variáveis de loop para goroutines explicitamente ao direcionar versões mais antigas do Go ou por clareza.
Constantes não tipadas se adaptam a diferentes tipos numéricos (const x = 1).
Constantes tipadas (const x int64 = 1) impõem um único tipo em expressões.
Apenas valores representáveis em tempo de compilação: strings, números, booleanos e expressões constantes derivadas.
Structs, slices e mapas requerem var.
_ descarta um valor, mas ainda conta como um nome à esquerda para regras de redeclaração.
_, err := f() declara err se for novo no bloco.
var fornece sem inicializadorVersões da Pilha: Esta página foi escrita para Go 1.26.x (padrão Green Tea GC, go fix modernizers - verifique o patch na compilação), chi (última - verifique na compilação), gin (última - verifique na compilação), echo (última - verifique na compilação), google.golang.org/grpc (última - verifique na compilação), sigs.k8s.io/controller-runtime (última - verifique na compilação), kubebuilder (última - verifique na compilação), tinygo (última - verifique os alvos de placa na compilação), wazero (última - verifique na compilação) e golangci-lint (última - verifique o conjunto de linters na compilação).
Revisado por Chris St. John·Última atualização: 18 de jul. de 2026