Lecții din modul (2/5)
Valoare zero și conversii de tip
În Go, fiecare variabilă declarată fără o valoare explicită primește a
valoare zero: „valoarea neutră” a tipului său. Este o diferență uriașă
din JavaScript, unde let x; produce undefined sau C, unde terminați
cu memoria gunoiului. Nu undefined, fără UB: doar zero.
Tabelul cu valori zero
| Categoria | Tip | Valoare zero |
|---|---|---|
| Numeric | int, int64, float32, float64, uint, ... | 0 |
| Boolean | bool | false |
| String | string | "" (șir gol) |
| Indicator | *T | nil |
| Sețiune / Hartă / Canal | []T, map[K]V, chan T | nil |
| Funcție / Interfață | func(...), interface{...} | nil |
| Struct | T struct{...} | toate câmpurile la valoarea lor zero |
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!)Conversiile sunt ÎNTOTDEAUNA explicite
Spre deosebire de C, Python sau JS, Go nu promovează automat unul
tip numeric la altul: trebuie să scrieți type(value).
i := 42
var f float64 = float64(i)
var u uint = uint(i)Acest lucru este valabil chiar și pentru tipurile „compatibile” precum int și int64: un
conversia explicită este întotdeauna necesară.
var a int = 10
var b int64 = int64(a) // obbligatorioConversie între cifre: ai grijă la trunchiere
Trecând de la float64 la int se trunchiază spre zero, nu
rotund:
f := 3.9
i := int(f) // 3, non 4
n := int(-3.9) // -3, non -4Conversie șir ↔ număr
string(65) NU dă "65": dă "A" (runa cu cod
punctul 65). Pentru șir → număr și invers aveți nevoie de strconv
pachet:
import "strconv"
s := strconv.Itoa(42) // "42"
n, err := strconv.Atoi("42") // 42, nilÎl vom acoperi în profunzime în modulul Stdlib.
Rândul tău
Declarați un contor variabil de tip int fără a-l inițializa și imprimați-l. Așteptată: 0.
Afișează indiciu
Fără un inițializator, variabila ia valoarea zero a tipului.
Soluție disponibilă după 3 încercări
Având în vedere numărul întreg n=10, convertiți n în float64 și împărțiți la 4. Imprimați rezultatul (așteptată 2,5).
Afișează indiciu
Fără conversia explicită, `n / 4` este o diviziune întreagă care dă 2.
Soluție disponibilă după 3 încercări
Ce imprimă acest cod?
f := 3.7
fmt.Println(int(f))Recapitulare
- Fiecare tip are o valoare zero consistentă: fără
undefined, fără UB. - Slice/map/chan/func/interface/pointer au valoarea zero
nil. - Conversiile numerice sunt întotdeauna explicite cu
type(value). int(float)trunchiază spre zero; pentru a rotunji folosițimath.Round.- Pentru șir ↔ număr utilizați pachetul
strconv(NU o distribuție directă).