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ștevar.x := 5a doua oară în același bloc:no new variables on left side of :=. Foloseștex = 5.- Variabilă declarată, dar nefolosită:
declared and not used: x. Șterge-o sau folosește_. - Umbrirea neintenționată a lui
errsau 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.