new în Go

Funcții predefinite (builtin) Go 1.0 (new(expresie): Go 1.26)

Alocă o variabilă nouă și returnează un pointer la ea; primește un tip (valoare zero) sau, din Go 1.26, o expresie.

Sintaxă
func new(TypeOrExpr) *Type

p := new(int)       // *int către 0
q := new(42)        // *int către 42 (Go 1.26)
c := new(Cont)      // *Cont cu câmpuri zero

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) sau new(map[string]int) crezând că obții o colecție utilizabilă: primești pointer la o valoare nil. Folosește make.
  • 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.