Ce face new
new(T) creează o variabilă nouă de tipul T, inițializată cu valoarea zero, și returnează adresa ei (*T). Este echivalent cu var x T; p := &x. Pentru struct-uri se folosește mai des literalul cu &: &Cont{Titular: "Ana"}, care permite și valori inițiale.
Din Go 1.26, new acceptă și o expresie: new(42) dă un *int către 42, iar new("Iași") un *string. Este foarte util pentru câmpuri opționale de tip pointer (de exemplu în struct-uri pentru JSON), unde înainte aveai nevoie de o variabilă temporară.
Nu confunda new cu make: make creează slice-uri, map-uri și canale gata de folosit, iar new(map[string]int) ar da un pointer la un map nil.
Parametri
| Parametru | Descriere |
|---|---|
TypeOrExpr |
Un tip (rezultatul indică valoarea zero) sau o expresie (rezultatul indică o copie a valorii ei). |
Ce returnează
Un pointer *T către variabila nou alocată.
Exemple
Exemplul 1: new cu tip și cu expresie
package main
import "fmt"
type Cont struct {
Titular string
Sold float64
}
func main() {
n := new(int)
*n += 5
fmt.Println(*n)
c := new(Cont)
c.Titular = "Ana"
fmt.Printf("%+v\n", *c)
varsta := new(30) // Go 1.26: pointer la o valoare dată
oras := new("Iași")
fmt.Println(*varsta, *oras)
}
Rezultat
5
{Titular:Ana Sold:0}
30 Iași
Exemplul 2: Câmpuri opționale în JSON
Un câmp pointer nil este omis; new(0) permite trimiterea explicită a valorii 0.
package main
import (
"encoding/json"
"fmt"
)
type Filtru struct {
Oras *string `json:"oras,omitempty"`
PretMax *int `json:"pret_max,omitempty"`
}
func main() {
a, _ := json.Marshal(Filtru{Oras: new("Cluj")})
b, _ := json.Marshal(Filtru{PretMax: new(0)})
c, _ := json.Marshal(Filtru{})
fmt.Println(string(a))
fmt.Println(string(b))
fmt.Println(string(c))
}
Rezultat
{"oras":"Cluj"}
{"pret_max":0}
{}
Greșeli frecvente
new([]int)saunew(map[string]int)crezând că obții o colecție utilizabilă: primești pointer la o valoarenil. Foloseștemake.new(42)în Go mai vechi de 1.26:42 is not a type.
Comenzi înrudite
make: Creează și inițializează slice-uri, map-uri și canale, cu lungime, capacitate sau buffer dat.pointeri (* și &): Un pointer (*T) ține adresa unei variabile; prin el funcțiile pot modifica valoarea originală.zero values (valori zero): Orice variabilă fără valoare inițială primește valoarea zero a tipului: 0, „”, false sau nil.struct și struct-uri: Grupează mai multe câmpuri cu nume și tipuri diferite într-un singur tip; baza pentru modelarea datelor în Go.