var și := în Go

Declară variabile: var cu tip sau valoare inițială, sau := (declarare scurtă cu tip dedus) în funcții.

Sintaxă
var nume tip
var nume tip = valoare
var nume = valoare      // tipul se deduce
nume := valoare         // declarare scurtă, doar în funcții
var (
    a int
    b = "text"
)

Ce face var și :=

var declară o variabilă. Dacă dai doar tipul (var n int), ea pornește de la valoarea zero a tipului: 0, "", false sau nil. Dacă dai o valoare, tipul poate lipsi, pentru că se deduce din valoare. Mai multe variabile se pot grupa într-un bloc var ( ... ).

În interiorul funcțiilor se folosește cel mai des declararea scurtă :=: oras := "Iași" declară și inițializează variabila, cu tipul dedus. := trebuie să declare cel puțin o variabilă nouă în partea stângă; celelalte, dacă există deja, primesc doar valori noi. În afara funcțiilor (la nivel de pachet) se poate folosi doar var.

O variabilă locală declarată și nefolosită este eroare de compilare (declared and not used). Valorile pe care vrei să le ignori le pui în _. Atenție la umbrire (shadowing): := într-un bloc interior creează o variabilă nouă cu același nume, iar cea exterioară rămâne neschimbată.

Exemple

Exemplul 1: Formele de declarare

%T afișează tipul dedus.

package main

import "fmt"

var versiune = "1.0" // la nivel de pachet: doar var

func main() {
    var varsta int // valoarea zero: 0
    var nume string = "Ana"
    var inaltime = 1.68 // tip dedus: float64
    oras := "Iași"      // declarare scurtă
    x, y := 3, 4        // mai multe deodată

    var (
        activ bool
        scor  = 9.5
    )
    fmt.Println(varsta, nume, inaltime, oras, x, y, activ, scor, versiune)
    fmt.Printf("%T %T %T %T\n", inaltime, oras, x, scor)
}

Rezultat

0 Ana 1.68 Iași 3 4 false 9.5 1.0
float64 string int float64

Exemplul 2: := cu o variabilă nouă și una existentă

err există deja, dar b este nouă, deci := este permis; err primește doar o valoare nouă.

package main

import (
    "fmt"
    "strconv"
)

func main() {
    a, err := strconv.Atoi("12")
    fmt.Println(a, err)
    b, err := strconv.Atoi("x7")
    fmt.Println(b, err)
}

Rezultat

12 <nil>
0 strconv.Atoi: parsing "x7": invalid syntax

Exemplul 3: Umbrirea unei variabile

:= din if creează un alt total; cel exterior rămâne 0. Corect ar fi total = 100.

package main

import "fmt"

func main() {
    total := 0
    if true {
        total := 100 // variabilă NOUĂ, doar în if
        fmt.Println("în if:", total)
    }
    fmt.Println("după if:", total)
}

Rezultat

în if: 100
după if: 0

Greșeli frecvente

  • := în afara funcțiilor: syntax error: non-declaration statement outside function body. Folosește var.
  • x := 5 a doua oară în același bloc: no new variables on left side of :=. Folosește x = 5.
  • Variabilă declarată, dar nefolosită: declared and not used: x. Șterge-o sau folosește _.
  • Umbrirea neintenționată a lui err sau a unui total într-un bloc interior.

Comenzi înrudite

  • const: Declară constante: valori fixe, calculate la compilare (numere, texte, bool), care nu se mai pot modifica.
  • zero values (valori zero): Orice variabilă fără valoare inițială primește valoarea zero a tipului: 0, „”, false sau nil.
  • tipuri de bază: Tipurile simple din Go: bool, string, întregi cu și fără semn, numere reale, complexe, byte și rune.
  • type: Definește un tip nou (pe baza altuia, struct, interfață, funcție) sau un alias pentru un tip existent.