Ce face zero values (valori zero)
În Go nu există variabile neinițializate. O variabilă declarată fără valoare primește automat valoarea zero a tipului ei: 0 pentru numere, "" pentru texte, false pentru bool și nil pentru pointeri, slice-uri, map-uri, canale, funcții și interfețe. La un struct, fiecare câmp primește valoarea zero a tipului lui; la un array, fiecare element.
Bibliotecile Go sunt gândite ca valoarea zero să fie direct utilizabilă: un strings.Builder, un bytes.Buffer sau un sync.Mutex declarat cu var funcționează imediat. Un slice nil se poate parcurge, are len 0 și acceptă append.
Excepția importantă: un map nil se poate citi (dă valoarea zero), dar scrierea în el oprește programul cu panic. Un map se creează cu make sau cu un literal (map[string]int{}).
Exemple
Exemplul 1: Valorile zero ale tipurilor
%q afișează textul între ghilimele, ca să se vadă că este gol.
package main
import "fmt"
type Elev struct {
Nume string
Nota float64
Bursa bool
}
func main() {
var n int
var x float64
var s string
var ok bool
var p *int
var lista []string
var m map[string]int
var e Elev
var note [3]int
fmt.Println(n, x, ok, p)
fmt.Printf("%q\n", s)
fmt.Println(lista == nil, len(lista), m == nil, len(m))
fmt.Printf("%+v\n", e)
fmt.Println(note)
}
Rezultat
0 0 false <nil>
""
true 0 true 0
{Nume: Nota:0 Bursa:false}
[0 0 0]
Exemplul 2: Valori zero utilizabile direct
strings.Builder și slice-ul nil merg fără inițializare; citirea dintr-un map nil dă 0.
package main
import (
"fmt"
"strings"
)
func main() {
var b strings.Builder
b.WriteString("Bună, ")
b.WriteString("Ana!")
fmt.Println(b.String())
var orase []string
orase = append(orase, "Iași", "Cluj")
fmt.Println(orase, len(orase))
var stoc map[string]int
fmt.Println("mere în stoc:", stoc["mere"])
}
Rezultat
Bună, Ana!
[Iași Cluj] 2
mere în stoc: 0
Greșeli frecvente
- Scrierea într-un map declarat doar cu
var m map[string]int:panic: assignment to entry in nil map. Foloseștem := map[string]int{}saumake. - Confuzia între „lipsă” și valoarea zero:
m["x"]dă 0 și pentru o cheie care nu există. Foloseștev, ok := m["x"]. - Dereferențierea unui pointer
nil:panic: runtime error: invalid memory address or nil pointer dereference.
Comenzi înrudite
var și :=: Declară variabile: var cu tip sau valoare inițială, sau := (declarare scurtă cu tip dedus) în funcții.pointeri (* și &): Un pointer (*T) ține adresa unei variabile; prin el funcțiile pot modifica valoarea originală.map și map-uri: Tabel cheie-valoare (dicționar): căutare rapidă după cheie, adăugare, ștergere și verificare cu v, ok.slice-uri: Lista dinamică din Go: o fereastră peste un array, cu lungime (len) și capacitate (cap), care crește cu append.struct și struct-uri: Grupează mai multe câmpuri cu nume și tipuri diferite într-un singur tip; baza pentru modelarea datelor în Go.