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:
int, float64, ...)string, rune)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.
"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
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.