В чем разница между объявлением переменной через `var` и через `:=` в Go?

Ответ

В Go существуют два основных способа объявления переменных: стандартное объявление с помощью ключевого слова var и короткое объявление с помощью оператора :=. У них есть ключевые различия.

Характеристикаvar (Стандартное объявление):= (Короткое объявление)
Область видимостиМожно использовать на уровне пакета (вне функций) и внутри функций.Можно использовать только внутри функций или других блоках кода (if, for).
ИнициализацияНеобязательна. Если значение не указано, переменной присваивается нулевое значение её типа (0, false, "", nil).Обязательна. Переменная должна быть инициализирована в момент объявления.
Указание типаТип можно указать явно (var i int) или позволить компилятору его вывести (var i = 10).Тип всегда выводится автоматически из значения справа.
ПереопределениеНельзя использовать для уже объявленной в той же области видимости переменной.Может "переобъявлять" существующие переменные, если в левой части есть хотя бы одна новая переменная.

Пример:

package main

import "fmt"

var packageScopeVar = "Доступна во всем пакете"
// shortScopeVar := "Ошибка, := нельзя на уровне пакета"

func main() {
    // 1. Объявление с нулевым значением
    var zeroInt int
    fmt.Printf("zeroInt: %vn", zeroInt) // Выведет: 0

    // 2. Короткое объявление
    i := 42
    fmt.Printf("i: %T, %vn", i, i) // Выведет: int, 42

    // 3. "Переопределение" с помощью :=
    i, j := 100, "hello"
    fmt.Printf("i: %v, j: %vn", i, j) // i перезаписана, j - новая переменная
}

Когда что использовать:

  • := — предпочтительный способ внутри функций для краткости и читаемости.
  • var — используется, когда:
    • Нужно объявить переменную на уровне пакета.
    • Нужно объявить переменную без немедленной инициализации (положиться на нулевое значение).
    • Тип переменной не очевиден, и вы хотите указать его явно (например, при работе с интерфейсами).