В чем разница между короткой (`:=`) и полной (`var`) формами объявления переменных в Go?

Ответ

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

Полная форма (var)

  1. Область видимости: Может использоваться как на уровне пакета, так и внутри функций.
  2. Инициализация: Переменную можно объявить без инициализации. В этом случае ей будет присвоено "нулевое значение" её типа (0 для чисел, false для bool, "" для string, nil для указателей, слайсов, мап и т.д.).
  3. Явный тип: Позволяет явно указать тип, что полезно, когда тип не очевиден или нужно использовать интерфейс.
// На уровне пакета (только var)
var globalVar int = 100

func someFunc() {
    // Внутри функции
    var i int       // i = 0 (нулевое значение)
    var s string = "hello" // с инициализацией
}

Короткая форма (:=)

  1. Область видимости: Может использоваться только внутри функций или других блочных конструкций (например, в if, for).
  2. Инициализация: Требует обязательной инициализации в момент объявления.
  3. Вывод типов: Тип переменной всегда выводится автоматически из значения справа.
  4. Переобъявление: := может переобъявить уже существующую переменную, если в левой части оператора есть хотя бы одна новая переменная.
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, когда нужно объявить переменную на уровне пакета, заранее объявить переменную с нулевым значением или когда нужно явно указать тип (например, для соответствия интерфейсу).