Lekcje modułu (2/5)
Zero Value i konwersje typów
W Go każda zmienna zadeklarowana bez jawnej wartości otrzymuje a
wartość zerowa: „wartość neutralna” swojego typu. To ogromna różnica
z JavaScript, gdzie let x; tworzy undefined lub C, gdzie kończysz
ze śmieciową pamięcią. Żadnego undefined, żadnego UB: tylko zero.
Tabela wartości zerowych
| Kategoria | Wpisz | Wartość zerowa |
|---|---|---|
| Numeryczne | KODEF0, KODEF1, KODEF2, KODEF3, KODEF4, ... | KODEF5 |
| Wartość logiczna | KODEF6 | KODEF7 |
| Ciąg | KODEF8 | "" (pusty ciąg znaków) |
| Wskaźnik | KODEF10 | KODEF11 |
| Kawałek / Mapa / Kanał | KODEF12, KODEF13, KODEF14 | KODEF15 |
| Funkcja / Interfejs | KODEF16, KODEF17 | KODEF18 |
| Struktura | KODEF19 | wszystkie pola mają wartość zerową |
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!)Konwersje są ZAWSZE jawne
W przeciwieństwie do C, Pythona czy JS, Go nie promuje automatycznie jednego
typ numeryczny na inny: musisz wpisać type(value).
i := 42
var f float64 = float64(i)
var u uint = uint(i)Dotyczy to nawet „kompatybilnych” typów, takich jak int i int64: an
zawsze wymagana jest jawna konwersja.
var a int = 10
var b int64 = int64(a) // obbligatorioKonwersja między liczbami: uważaj na obcięcie
Przechodząc od float64 do int obcina do zera, tak nie jest
okrągłe:
f := 3.9
i := int(f) // 3, non 4
n := int(-3.9) // -3, non -4Konwersja ciągu ↔ liczby
string(65) NIE daje "65": daje "A" (runa z kodem
punkt 65). Dla ciągu → liczby i odwrotnie potrzebny jest kod strconv
pakiet:
import "strconv"
s := strconv.Itoa(42) // "42"
n, err := strconv.Atoi("42") // 42, nilOmówimy to szczegółowo w module Stdlib.
Twoja kolej
Zadeklaruj licznik zmiennych typu int bez jego inicjowania i wydrukuj. Oczekiwano: 0.
Pokaż wskazówkę
Bez inicjatora zmienna przyjmuje wartość zerową typu.
Rozwiązanie dostępne po 3 próbach
Biorąc pod uwagę liczbę całkowitą n=10, zamień n na float64 i podziel przez 4. Wydrukuj wynik (oczekiwane 2,5).
Pokaż wskazówkę
Bez jawnej konwersji `n / 4` jest dzieleniem liczb całkowitych dającym 2.
Rozwiązanie dostępne po 3 próbach
Co wypisuje ten kod?
f := 3.7
fmt.Println(int(f))Podsumowanie
- Każdy typ ma stałą wartość zerową: brak
undefined, brak UB. - Kawałek/mapa/chan/funkcja/interfejs/wskaźnik mają wartość zerową
nil. - Konwersje numeryczne są zawsze jawne w przypadku
type(value). int(float)obcina w kierunku zera; do zaokrąglenia użyjmath.Round.- Dla ciągu ↔ liczby użyj pakietu
strconv(NIE bezpośredniego rzutowania).