Модульні уроки (2/5)
Нульові перетворення значень і типів
У Go кожна змінна, оголошена без явного значення, отримує a
нульове значення: "нейтральне значення" свого типу. Це величезна різниця
з 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 на float64 і поділіть на 4. Виведіть результат (очікується 2,5).
Показати підказку
Без явного перетворення "n / 4" є цілим діленням, яке дає 2.
Рішення доступне після 3 спроб
Що друкує цей код?
f := 3.7
fmt.Println(int(f))Підведення підсумків
- Кожен тип має узгоджене нульове значення: ні
undefined, ні UB. - Slice/map/chan/func/interface/pointer мають нульове значення
nil. - Числові перетворення завжди є явними з
type(value). int(float)скорочується до нуля; для округлення використовуйтеmath.Round.- Для рядка ↔ номер використовуйте пакет
strconv(НЕ пряме приведення).