Перейти к основному содержимому
Модуль 1 · Урок 2 из 52/50 в курсе~10 min
Уроки модуля (2/5)

Нулевое значение и преобразование типов

В Go каждая переменная, объявленная без явного значения, получает нулевое значение: «нейтральное значение» своего типа. Это огромная разница из JavaScript, где let x; создает undefined, или C, где вы заканчиваете вверх с мусорной памятью. Нет undefined, нет UB: просто ноль.

Таблица нулевых значений

КатегорияТипНулевое значение
Числовойint, int64, float32, float64, uint, ...0
Логическоеboolfalse
Строкаstring"" (пустая строка)
Указатель*Tnil
Срез/Карта/Канал[]T, map[K]V, chan Tnil
Функция/Интерфейсfunc(...), interface{...}nil
СтруктураT struct{...}все поля имеют нулевое значение
Go
var i int        // 0
var f float64    // 0
var s string     // ""
var b bool       // false
var p *int       // nil
var nums []int   // nil  (NB: una slice nil ha len 0 e si può iterare!)

Конверсии ВСЕГДА являются явными

В отличие от C, Python или JS, Go не продвигает их автоматически числовой тип в другой: необходимо написать type(value).

Go
i := 42
var f float64 = float64(i)
var u uint = uint(i)

Это верно даже для «совместимых» типов, таких как int и int64: всегда требуется явное преобразование.

Go
var a int = 10
var b int64 = int64(a)  // obbligatorio

Преобразование между числами: следите за усечением

При переходе от float64 к int усекается до нуля, это не так. раунд:

Go
f := 3.9
i := int(f)   // 3, non 4
n := int(-3.9) // -3, non -4

Преобразование строки ↔ числа

string(65) НЕ даёт "65": даёт "A" (руна с кодом пункт 65). Для строки → числа и наоборот вам понадобится strconv. пакет:

Go
import "strconv"

s := strconv.Itoa(42)        // "42"
n, err := strconv.Atoi("42") // 42, nil

Мы подробно рассмотрим это в модуле Stdlib.

Ваша очередь

Упражнение#go.m1.l2.e1
Попыток: 0Загрузка…

Объявите переменную-счетчик типа int, не инициализируя ее, и распечатайте ее. Ожидается: 0.

Загрузка редактора…
Показать подсказку

Без инициализатора переменная принимает нулевое значение типа.

Решение доступно после 3 попыток

Упражнение#go.m1.l2.e2
Попыток: 0Загрузка…

Учитывая целое число n=10, преобразуйте n в число с плавающей запятой64 и разделите на 4. Выведите результат (ожидаемое значение 2,5).

Загрузка редактора…
Показать подсказку

Без явного преобразования `n/4` — это целочисленное деление, дающее 2.

Решение доступно после 3 попыток

Quiz#go.m1.l2.e3
Готово

Что печатает этот код?

Go
f := 3.7
fmt.Println(int(f))
Варианты ответа

Резюме

  • Каждый тип имеет единое нулевое значение: нет undefined, нет UB.
  • Срез/карта/канал/функция/интерфейс/указатель имеют нулевое значение nil.
  • Числовые преобразования всегда являются явными с помощью type(value).
  • int(float) усекается до нуля; для округления используйте math.Round.
  • Для строки ↔ номера используйте пакет strconv (НЕ прямое приведение).