Declaração de Tipo por Inferência
Como Go pode determinar o tipo de uma variável por seu valor inicial, podemos simplificar o processo de declaração de tipo eliminando a etapa de especificar explicitamente o tipo?
package main
import "fmt"
func main() {
// var a int = 1
var a = 1 // Type is inferred
fmt.Println(a)
}
Agora você nem precisa usar a palavra-chave var para definir uma variável.
Essa forma de declarar e inicializar uma variável também pode ser combinada com o método de declaração em lote:
a, b, c := 0
// Declare variables a, b, c as integers and assign an initial value of 0
a, b, c := 0, "", true
// Declare variables a, b, c as integer, string, and boolean, respectively
A declaração abreviada é muito conveniente, mas tenha cuidado, pois := não é uma operação de atribuição. É uma forma de declarar variáveis e é exclusiva do Go, usada para declarar e inicializar variáveis locais dentro de uma função. O tipo da variável será automaticamente inferido com base na expressão.
Às vezes, escrevemos o seguinte código:
func main() {
a := 1
println(a)
a := 2
println(a)
}
O compilador informará que há um erro no código porque a variável a foi redeclarada. No entanto, se for escrito da seguinte forma:
func main() {
a := 1
if true {
a := 2
println(a) // Output: 2
}
println(a) // Output: 1
}
Há essa saída porque o a com valor 1 acima e o a com valor 2 abaixo não estão no mesmo escopo de variável (dentro das mesmas chaves), então o compilador os trata como duas variáveis diferentes.
O compilador não apontará seu erro, mas haverá uma saída inesperada.
Em Go, está estipulado que:
Cada instrução fora de uma função deve começar com uma palavra-chave (var, func, etc.).
Portanto, a declaração abreviada de variável só pode ser usada para declarar variáveis locais e não pode ser usada para declarar variáveis globais.
Então, o que é uma variável global e o que é uma variável local?
Isso envolve o conceito de tempo de vida da variável, que será explicado na próxima seção.