Go Fundamentos Básico
Variáveis e zero values
Em Go, toda variável declarada sem valor explícito recebe automaticamente seu zero value. Isso significa que não existem variáveis "indefinidas": int vira 0, string vira "", bool vira false, ponteiros e slices viram nil, e assim por diante. Esse comportamento torna o código previsível e evita erros comuns em outras linguagens.
Você pode declarar variáveis com var nome tipo ou, dentro de funções, usar a forma curta nome := valor. A forma curta infere o tipo e só pode ser usada dentro de funções. Já var pode ser usado em qualquer escopo, inclusive no nível do pacote.
O escopo de uma variável é o bloco onde ela foi declarada. Um bloco é delimitado por chaves {}. Se você declarar uma variável com o mesmo nome em um bloco interno, ocorre shadowing (sombreamento): a variável interna "esconde" a externa enquanto aquele bloco estiver em execução. Isso é útil, mas pode causar confusão se não for intencional.
Neste card, vamos explorar como declarar variáveis, quais são os zero values dos tipos básicos, como o escopo funciona na prática e como o shadowing pode afetar seu programa.
Pontos-chave
var x intdeclara x com zero value0;y := 10infere o tipo e inicializa.- Zero values:
0para números,""para string,falsepara bool,nilpara ponteiros, slices, maps, channels e interfaces. - O escopo de uma variável é o bloco
{}onde ela foi declarada. - Shadowing ocorre quando uma variável interna tem o mesmo nome de uma externa e a esconde dentro do bloco.
- Use
varpara declarar sem inicializar ou no nível de pacote; use:=para declarações curtas dentro de funções.
package main
import "fmt"
var global int // zero value: 0
func main() {
// Declaração com var e zero value
var a int
var b string
var c bool
fmt.Println("zero values:", a, b, c) // 0 "" false
// Declaração curta com inferência
nome := "Go"
idade := 15
fmt.Println(nome, idade)
// Escopo de bloco e shadowing
x := 10
fmt.Println("x externo:", x)
{
x := 20 // nova variável, sombreia a externa
fmt.Println("x interno:", x)
}
fmt.Println("x externo novamente:", x)
// Zero value de um ponteiro
var p *int
fmt.Println("ponteiro nil?", p == nil)
}