0Pricing
Go Academy · Lezione

new() e quando utilizzare i puntatori

Allocazione con new e modelli comuni per i puntatori

new() e quando utilizzare i puntatori è una lezione Go Academy gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Go Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Go Academy include 4 lezioni in totale.

Il built-in new()

new(T) alloca uno T azzerato e restituisce un *T. Per le struct equivale a &T{}:

package main
import "fmt"

func main() {
    p := new(int)
    fmt.Println(*p)     // 0
    *p = 42
    fmt.Println(*p)     // 42

    type Point struct{ X, Y int }
    pt := new(Point)
    fmt.Println(*pt)    // {0 0}
}

new e &T{}

Per le struct, &T{} è più idiomatico e consente di inizializzare i campi. new viene usato raramente nel Go moderno:

package main
import "fmt"

type Config struct{ Port int; Host string }

func main() {
    a := new(Config)          // zeroed
    b := &Config{Port: 8080}  // initialized
    fmt.Println(a, b)
}

Quando restituire un puntatore

Restituisca un puntatore da un costruttore quando:

  • La struct mantiene uno stato e i chiamanti devono condividere la stessa istanza
  • La struct ha metodi con ricevitore puntatore (necessari per la soddisfazione delle interfacce)
  • La struct è grande e le copie sarebbero costose

Quando restituire un valore

Restituisca un valore quando:

  • Il tipo è piccolo (pochi campi)
  • Rappresenta una configurazione immutabile
  • Vuole rendere chiaro che i chiamanti ricevono copie indipendenti

Esempio: time.Time viene restituito per valore nonostante abbia molti metodi.

Puntatori nelle slice e nelle map

Memorizzare puntatori nelle collezioni consente di condividere le modifiche:

package main
import "fmt"

type User struct{ Name string; Score int }

func main() {
    users := []*User{{"Alice", 0}, {"Bob", 0}}
    users[0].Score = 100
    fmt.Println(users[0]) // &{Alice 100}
}

Puntatori a tipi primitivi per l'opzionalità

Un campo *int o *string può essere nil per indicare "non impostato". È utile per JSON con omitempty o per colonne opzionali del database:

package main
import "fmt"

type Profile struct {
    Name string
    Age  *int // nil means not provided
}

func main() {
    p := Profile{Name: "Alice"}
    fmt.Println(p.Age == nil) // true
    age := 30
    p.Age = &age
    fmt.Println(*p.Age) // 30
}

Evitare la proliferazione dei puntatori

L'uso eccessivo dei puntatori aumenta la pressione sul GC e riduce la località della cache. Esegua un benchmark prima di convertire i tipi valore in puntatori solo per motivi di prestazioni.

make e new

make inizializza slice, map e channel (che richiedono una configurazione interna). new alloca qualsiasi tipo azzerato e restituisce un puntatore. Hanno scopi diversi:

package main
import "fmt"

func main() {
    s := make([]int, 5)           // usable slice
    m := make(map[string]int)     // usable map
    p := new(int)                 // *int pointing to 0
    fmt.Println(s, m, *p)
}

Pattern del puntatore immutabile

Restituisca *T, ma lo documenti come immutabile: i consumatori non dovrebbero modificarlo. È una pratica comune per gli oggetti di configurazione condivisi tra goroutine.

Riepilogo della sicurezza dei puntatori

Regole per usare i puntatori in sicurezza:

  • Controlli sempre nil prima di dereferenziare
  • Non conservi i puntatori a variabili dello stack oltre la durata della variabile (l'analisi di escape di Go gestisce questo aspetto)
  • Non esegua mai il cast di unsafe.Pointer se non è assolutamente necessario
  • Lasci che il compilatore gestisca la distinzione tra stack e heap

Verifica rapida

Che cosa restituisce new(int)?

Riepilogo: new e puntatori

Punti chiave:

  • new(T) restituisce *T azzerato; viene usato raramente, quindi preferisca &T{}
  • Restituisca valori per i tipi piccoli o immutabili, puntatori per quelli con stato o di grandi dimensioni
  • I campi *T consentono di usare nil con il significato di assente
  • Non usi eccessivamente i puntatori: il GC ha un costo

Esercizio

Crei una struct Settings con un campo *int chiamato MaxConnections. Scriva una funzione che accetti *Settings e imposti un valore predefinito solo quando il campo è nil.

Domande Frequenti

La lezione «new() e quando utilizzare i puntatori» è gratuita?

Sì — il testo completo di «new() e quando utilizzare i puntatori» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Go Academy, passa a CoddyKit PRO. Il corso Go Academy include 4 lezioni in totale.

Cosa imparerò in «new() e quando utilizzare i puntatori»?

Allocazione con new e modelli comuni per i puntatori Eserciti Go Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Go Academy?

Non è richiesta alcuna esperienza precedente. Go Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.

Quanto tempo richiede la lezione «new() e quando utilizzare i puntatori»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Go Academy?

Sì. Ogni lezione Go Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Che cosa sono i puntatori?
  2. Puntatori e funzioni
  3. Receiver per puntatori nei metodi
  4. new() e quando utilizzare i puntatori
← Torna a Go Academy