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

Нульові перетворення значень і типів

У Go кожна змінна, оголошена без явного значення, отримує a нульове значення: "нейтральне значення" свого типу. Це величезна різниця з 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 на float64 і поділіть на 4. Виведіть результат (очікується 2,5).

Завантаження редактора…
Показати підказку

Без явного перетворення "n / 4" є цілим діленням, яке дає 2.

Рішення доступне після 3 спроб

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

Що друкує цей код?

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

Підведення підсумків

  • Кожен тип має узгоджене нульове значення: ні undefined, ні UB.
  • Slice/map/chan/func/interface/pointer мають нульове значення nil.
  • Числові перетворення завжди є явними з type(value).
  • int(float) скорочується до нуля; для округлення використовуйте math.Round.
  • Для рядка ↔ номер використовуйте пакет strconv (НЕ пряме приведення).