Определение типа переменной по контексту (тип выводится автоматически)
Поскольку Go может определить тип переменной по ее начальному значению, можно ли упростить процесс объявления типа, исключив шаг явного указания типа?
package main
import "fmt"
func main() {
// var a int = 1
var a = 1 // Тип выводится автоматически
fmt.Println(a)
}
Теперь вы даже не обязаны использовать ключевое слово var
для определения переменной.
Такой способ объявления и инициализации переменной также можно сочетать с методом пакетного объявления:
a, b, c := 0
// Объявить переменные a, b, c как целочисленные и присвоить им начальное значение 0
a, b, c := 0, "", true
// Объявить переменные a, b, c соответственно как целочисленную, строковую и логическую
Короткое объявление очень удобно, но будьте осторожны, так как :=
не является операцией присваивания. Это способ объявления переменных, уникальный для Go, используемый для объявления и инициализации локальных переменных внутри функции. Тип переменной будет автоматически определен на основе выражения.
Иногда мы пишем следующий код:
func main() {
a := 1
println(a)
a := 2
println(a)
}
Компилятор сообщит вам, что в коде есть ошибка, потому что переменная a
была переобъявлена. Однако, если написать код следующим образом:
func main() {
a := 1
if true {
a := 2
println(a) // Вывод: 2
}
println(a) // Вывод: 1
}
Такой вывод получается потому, что переменная a
со значением 1
выше и переменная a
со значением 2
ниже находятся в разных областях видимости переменных (внутри разных фигурных скобок), поэтому компилятор воспринимает их как две разные переменные.
Компилятор не укажет на вашу ошибку, но может появиться неожиданный вывод.
В Go установлено, что:
Каждая инструкция вне функции должна начинаться с ключевого слова (var
, func
и т.д.).
Поэтому краткое объявление переменных можно использовать только для объявления локальных переменных и не может быть использовано для объявления глобальных переменных.
Так что такое глобальная переменная, а что такое локальная переменная?
Это связано с концепцией времени жизни переменной, которая будет рассмотрена в следующем разделе.