Ответ
В Go есть две основные формы объявления переменных: полная с использованием ключевого слова var
и короткая с использованием оператора :=
.
Полная форма (var
)
- Область видимости: Может использоваться как на уровне пакета, так и внутри функций.
- Инициализация: Переменную можно объявить без инициализации. В этом случае ей будет присвоено "нулевое значение" её типа (
0
для чисел,false
дляbool
,""
дляstring
,nil
для указателей, слайсов, мап и т.д.). - Явный тип: Позволяет явно указать тип, что полезно, когда тип не очевиден или нужно использовать интерфейс.
// На уровне пакета (только var)
var globalVar int = 100
func someFunc() {
// Внутри функции
var i int // i = 0 (нулевое значение)
var s string = "hello" // с инициализацией
}
Короткая форма (:=
)
- Область видимости: Может использоваться только внутри функций или других блочных конструкций (например, в
if
,for
). - Инициализация: Требует обязательной инициализации в момент объявления.
- Вывод типов: Тип переменной всегда выводится автоматически из значения справа.
- Переобъявление:
:=
может переобъявить уже существующую переменную, если в левой части оператора есть хотя бы одна новая переменная.
func anotherFunc() {
// Объявление и инициализация. Тип выводится автоматически.
x := 42 // x имеет тип int
y := "world" // y имеет тип string
// Ошибка: нельзя использовать вне функции
// z := 10
// Особенность: переобъявление err
file, err := os.Open("file.txt")
if err != nil {
// ...
}
// здесь err уже объявлена, но мы можем использовать := снова,
// так как слева есть новая переменная 'data'
data, err := io.ReadAll(file)
if err != nil {
// ...
}
}
Сводная таблица
Характеристика | var | := |
---|---|---|
Где используется | Уровень пакета, функции | Только внутри функций/блоков |
Инициализация | Не обязательна | Обязательна |
Вывод типа | Возможен (var x = 10 ) | Всегда |
Явное указание типа | Возможно (var x int ) | Невозможно |
Рекомендации: Внутри функций предпочтительнее использовать :=
для краткости и читаемости. Используйте var
, когда нужно объявить переменную на уровне пакета, заранее объявить переменную с нулевым значением или когда нужно явно указать тип (например, для соответствия интерфейсу).