ProgrammazioneSviluppatore Go

Quali tipi di dati in Go sono considerati comparabili (comparable) e cosa succede se si tenta di confrontare tipi non comparabili? Come influisce sull'uso di map e set?

Supera i colloqui con l'assistente IA Hintsage

Risposta

In Go, le variabili possono essere confrontate tra loro utilizzando l'operatore == o utilizzandole come chiavi nelle mappe solo se il loro tipo è comparabile. I tipi comparabili includono:

  • Tutti i tipi numerici (int, float64, ...)
  • Stringhe (string, rune)
  • Puntatori
  • Canali
  • Interfacce, se i loro valori sono comparabili
  • Array e strutture, se tutti i loro campi sono comparabili

Fette, mappe, funzioni — non sono comparabili!

Tentare di confrontare tali valori genera un errore di compilazione. Ad esempio:

var a = []int{1,2,3} var b = []int{1,2,3} printf("%v", a==b) // errore di compilazione: slice può essere confrontato solo con nil

Per utilizzare un valore come chiave in una mappa, deve necessariamente essere comparabile. Se il tipo non è conforme, si verifica un errore di compilazione.

Domanda trabocchetto

"Due strutture possono essere considerate comparabili se solo alcune delle loro campi non sono comparabili?"

Molti rispondono "sì", ma questo è errato. Se anche solo un campo della struttura non è comparabile (ad esempio, un slice o una mappa), l'intera struttura diventa non comparabile.

Esempio:

type T struct { A int S []string } var t1, t2 T t1 == t2 // errore di compilazione: Le fette non sono comparabili

Esempi di errori reali a causa della mancanza di conoscenza delle sottigliezze dell'argomento


Storia

Uno sviluppatore ha tentato di utilizzare uno slice come chiave in una mappa per memorizzare i risultati dei calcoli, il che ha causato un errore di compilazione. È stato sostituito con una stringa con un serializzatore esplicito — il problema è stato risolto.


Storia

Al momento dell'aggiunta di un nuovo campo (tipo slice) in una struttura utilizzata come chiave in un dizionario, il progetto ha smesso di compilarsi all'improvviso. Motivo: la struttura è diventata non comparabile, ma nessuno si aspettava che ciò si propagasse nelle strutture nidificate.


Storia

Per creare un insieme (set) di strutture con slice all'interno, hanno tentato di utilizzare una mappa. Non comprendendo le regole di confronto, hanno ricevuto molti errori di runtime quando hanno cercato di confrontare gli elementi, ma la causa era l'impossibilità di compilarli con quella chiave.