Уроки модуля (2/5)
Нулевое значение и преобразование типов
В Go каждая переменная, объявленная без явного значения, получает
нулевое значение: «нейтральное значение» своего типа. Это огромная разница
из JavaScript, где let x; создает undefined, или C, где вы заканчиваете
вверх с мусорной памятью. Нет undefined, нет UB: просто ноль.
Таблица нулевых значений
| Категория | Тип | Нулевое значение |
|---|---|---|
| Числовой | int, int64, float32, float64, uint, ... | 0 |
| Логическое | bool | false |
| Строка | string | "" (пустая строка) |
| Указатель | *T | nil |
| Срез/Карта/Канал | []T, map[K]V, chan T | nil |
| Функция/Интерфейс | func(...), interface{...} | nil |
| Структура | T struct{...} | все поля имеют нулевое значение |
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).
i := 42
var f float64 = float64(i)
var u uint = uint(i)Это верно даже для «совместимых» типов, таких как int и int64:
всегда требуется явное преобразование.
var a int = 10
var b int64 = int64(a) // obbligatorioПреобразование между числами: следите за усечением
При переходе от float64 к int усекается до нуля, это не так.
раунд:
f := 3.9
i := int(f) // 3, non 4
n := int(-3.9) // -3, non -4Преобразование строки ↔ числа
string(65) НЕ даёт "65": даёт "A" (руна с кодом
пункт 65). Для строки → числа и наоборот вам понадобится strconv.
пакет:
import "strconv"
s := strconv.Itoa(42) // "42"
n, err := strconv.Atoi("42") // 42, nilМы подробно рассмотрим это в модуле Stdlib.
Ваша очередь
Объявите переменную-счетчик типа int, не инициализируя ее, и распечатайте ее. Ожидается: 0.
Показать подсказку
Без инициализатора переменная принимает нулевое значение типа.
Решение доступно после 3 попыток
Учитывая целое число n=10, преобразуйте n в число с плавающей запятой64 и разделите на 4. Выведите результат (ожидаемое значение 2,5).
Показать подсказку
Без явного преобразования `n/4` — это целочисленное деление, дающее 2.
Решение доступно после 3 попыток
Что печатает этот код?
f := 3.7
fmt.Println(int(f))Резюме
- Каждый тип имеет единое нулевое значение: нет
undefined, нет UB. - Срез/карта/канал/функция/интерфейс/указатель имеют нулевое значение
nil. - Числовые преобразования всегда являются явными с помощью
type(value). int(float)усекается до нуля; для округления используйтеmath.Round.- Для строки ↔ номера используйте пакет
strconv(НЕ прямое приведение).