zero values (valori zero) în Go

Orice variabilă fără valoare inițială primește valoarea zero a tipului: 0, "", false sau nil.

Sintaxă
var n int        // 0
var s string     // ""
var ok bool      // false
var p *int       // nil
var m map[string]int  // nil

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ște m := map[string]int{} sau make.
  • Confuzia între „lipsă” și valoarea zero: m["x"] dă 0 și pentru o cheie care nu există. Folosește v, 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.