Generics nella pratica: insidie
Quando utilizzare i generics e quali sono gli errori più comuni
Generics nella pratica: insidie è 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.
Usare troppi generics
Non tutte le funzioni devono essere generiche. Se viene usato un solo tipo concreto, un generico aggiunge complessità senza offrire vantaggi. Preferisca i tipi concreti e passi ai generics quando compare una duplicazione.
Asserzione di tipo nei generics
Non è possibile usare un'asserzione di tipo o un type switch all'interno di una funzione generica sul parametro di tipo stesso: i generics non sono template. Usi invece le interfacce o il pacchetto reflect.
// WRONG:
func Foo[T any](v T) {
if x, ok := v.(int); ok { // compile error
}
}Comparable non significa Ordered
comparable supporta solo ==. Per usare <, >, servono cmp.Ordered o un vincolo personalizzato. Un errore comune consiste nel pensare che comparable includa anche l'ordinamento.
Un metodo non può introdurre parametri di tipo
I metodi dei tipi generici riutilizzano i parametri del tipo, ma non possono aggiungerne di nuovi. Se un metodo richiede un ulteriore parametro di tipo, usi invece una funzione a livello globale.
// WRONG:
func (s *Stack[T]) MapTo[U any]() []U // compile errorValori nil e valori zero
Per i parametri di tipo puntatore, il valore zero è nil. Per i tipi valore, è lo zero del tipo. Gestisca sempre il caso zero invece di presumere che il valore non sia nil.
Insiemi di metodi delle interfacce e generics
Una funzione generica vincolata a un'interfaccia può chiamare solo i metodi dichiarati in quell'interfaccia. Aggiungere metodi a un tipo concreto non li rende disponibili tramite il vincolo.
Duplicazione delle istanziazioni (GC shapes)
Go condivide le implementazioni per i tipi con la stessa GC shape, ad esempio tutti i tipi puntatore condividono un'unica implementazione. I tipi primitivi ricevono ciascuno la propria, ma l'approccio di Go mantiene ragionevoli le dimensioni dei binari.
Any non è interface{}
any è un alias per interface{}, ma una funzione generica F[T any] non equivale a F(v interface{}): nella funzione generica, T è il tipo concreto nel punto della chiamata e conserva le informazioni sul tipo.
Tipi generici ricorsivi
Go non supporta definizioni ricorsive dei parametri di tipo come type Tree[T Tree[T]]. Usi invece la composizione:
type TreeNode[T any] struct {
Val T
Left *TreeNode[T]
Right *TreeNode[T]
}Helper pre-istanziati
Per il codice sensibile alle prestazioni, pre-istanzi le funzioni generiche usate più frequentemente come funzioni a livello globale, per evitare il sovraccarico ripetuto dell'inferenza dei tipi, anche se il compilatore Go gestisce bene questo aspetto.
Testare il codice generico
Testi le funzioni generiche con più istanziazioni: una per ogni vincolo distinto (int, string, un tipo personalizzato). In questo modo vengono rilevati i casi limite specifici del vincolo.
func TestMap(t *testing.T) {
got := Map([]int{1,2}, double)
// test with strings too
gotS := Map([]string{"a","b"}, strings.ToUpper)
}Verifica rapida
Perché NON è possibile usare un type switch sul parametro di tipo generico T all'interno di una funzione generica?
Riepilogo: problemi dei generics
Punti chiave:
- Non usi troppi generics: i tipi concreti sono più semplici quando vengono usati una sola volta
- Nessun type switch o asserzione di tipo su T nelle funzioni generiche
- comparable ≠ ordered; usi cmp.Ordered per supportare <
- I metodi non possono introdurre nuovi parametri di tipo
Impara Go con un tutor IA — gratis
Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.
- Corsi
- 51
- Lezioni
- 203
Domande Frequenti
La lezione «Generics nella pratica: insidie» è gratuita?
Sì — il testo completo di «Generics nella pratica: insidie» è 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 «Generics nella pratica: insidie»?
Quando utilizzare i generics e quali sono gli errori più comuni 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 «Generics nella pratica: insidie»?
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
- Sintassi dei parametri di tipo
- Vincoli: comparable e interfacce
- Strutture dati generiche
- Generics nella pratica: insidie