Все вопросы

07 Типы и значения

Чем := отличается от обычного присваивания?

:= объявляет хотя бы одну новую переменную в текущем блоке и сразу даёт ей значение. = только записывает в уже существующие имена. Повторное := во вложенном if легко создаёт новые переменные с теми же именами и прячет внешние.

В примере внутренние n и err живут только внутри if. Снаружи остаются n == 10 и err == nil, хотя разбор строки "нет" завершился ошибкой.

Если нужно обновить те же переменные, пиши n, err = strconv.Atoi(...) — одно равно, без двоеточия.

Пример

Go

внутренний err не трогает внешний

package main

import (
    "fmt"
    "strconv"
)

func main() {
    n, err := strconv.Atoi("10")
    if err != nil {
        panic(err)
    }

    if n, err := strconv.Atoi("нет"); err != nil {
        fmt.Println("внутри if:", err)
        fmt.Println("внутренний n:", n)
    }

    fmt.Println("снаружи n =", n, "err =", err)
}