Nomeando valores
Todo programa trabalha com valores. Alguns desses valores mudam enquanto o programa executa — um contador que incrementa, um status que passa de pendente para completo. Outros nunca mudam — um número máximo de tentativas, o valor de pi, o nome de uma aplicação.
Go oferece duas ferramentas para nomear valores: variáveis para coisas que mudam, e constantes para coisas que não mudam.
Variáveis
Uma variável é um espaço de armazenamento com nome. Seu valor pode ser reatribuído a qualquer momento durante a execução do programa.
A keyword var
A forma mais explícita de declarar uma variável é com a keyword var, seguida do nome, do tipo e, opcionalmente, de um valor inicial:
Quando você declara uma variável sem atribuir um valor, Go a inicializa com seu zero value — o valor padrão para aquele tipo. Todo tipo tem um: 0 para inteiros, 0.0 para floats, false para booleanos, "" para strings. Não existe variável não inicializada em Go.
Se você fornecer um valor inicial, Go consegue inferir o tipo — não é necessário declará-lo explicitamente:
Short variable declaration
Dentro de uma função, você pode omitir tanto o var quanto o tipo usando o operador :=. Ele declara e inicializa a variável em um único passo:
O tipo é sempre inferido do lado direito. Short declarations são a forma mais comum de declaração de variável em Go — são concisas e mantêm as funções legíveis.
Uma restrição importante: := não pode ser usado em package level. Ele só é válido dentro de funções.
Reatribuição e reutilização do :=
:= exige que ao menos uma variável do lado esquerdo seja nova. Isso permite reutilizá-lo ao declarar uma nova variável junto com uma já existente:
Se todas as variáveis do lado esquerdo já existem, use = para reatribuição:
Múltiplas variáveis
Você pode declarar múltiplas variáveis em uma única linha:
Ou agrupá-las em um bloco var — comum para declarações relacionadas no topo de uma função ou em package level:
Package-level vs function-level
Variáveis podem ser declaradas em dois escopos:
Variáveis package-level são declaradas fora de qualquer função. Elas são acessíveis em todo o package e inicializadas antes de main executar.
Variáveis function-level são declaradas dentro de uma função. Elas existem apenas durante aquela chamada de função e são invisíveis fora dela.
Constantes
Uma constante é um valor com nome que não pode mudar após ser definido. Ela não é uma variável com proteção — é avaliada inteiramente em tempo de compilação e nunca ocupa um espaço de memória em runtime.
A keyword const
Constantes são declaradas com const:
Assim como variáveis, constantes suportam declarações agrupadas:
O que pode ser uma constante
Nem todo valor se qualifica como constante. O compilador precisa ser capaz de determinar seu valor antes de o programa executar. Valores válidos incluem:
- Literais booleanos:
true,false - Literais inteiros, float e complex
- Literais string e rune
- Expressões avaliáveis em tempo de compilação:
1 << 8,2 * 3.14,1 < 2 - Chamadas a certas funções built-in:
len,cap,real,imag,complex
Chamadas a funções que produzem valores em runtime — como ler um arquivo ou chamar time.Now() — não podem ser usadas como constantes.
Typed e untyped constants
Constantes em Go existem em duas formas: typed e untyped.
Uma typed constant carrega um tipo explícito e só pode ser atribuída diretamente a uma variável daquele mesmo tipo:
Uma untyped constant não tem tipo fixo. Ela carrega um kind (inteiro, float, string ou booleano) e se adapta ao tipo esperado no ponto de uso:
iota
Quando você precisa de uma sequência de constantes inteiras relacionadas, Go fornece o iota — um contador que começa em zero e incrementa em um a cada entrada no bloco:
iota é resetado para zero no início de cada novo bloco const. É a forma idiomática de definir enumerações em Go.
Variáveis vs constantes
Tanto variáveis quanto constantes podem ser declaradas em package level ou function level, e ambas suportam declarações agrupadas com chaves. As diferenças são mais significativas do que parecem:
var | const | |
|---|---|---|
| Valor pode mudar | sim | não |
| Avaliada em | runtime | compile time |
Short form (:=) | sim (apenas funções) | não |
| Pode ficar sem uso | não (apenas local) | sim |
A regra sobre variáveis não utilizadas merece destaque: uma variável local declarada mas nunca referenciada é um erro de compilação. Constantes são sempre isentas — podem existir puramente para documentação ou uso futuro sem que o compilador objete.