In Go kunnen variabelen met elkaar worden vergeleken met de operator == of kunnen ze worden gebruikt als sleutel in een map, alleen als hun type vergelijkbaar is. De vergelijkbare types zijn:
int, float64, ...)string, rune)Slices, maps, functies — niet vergelijkbaar!
Het proberen om dergelijke waarden te vergelijken leidt tot een compilatiefout. Bijvoorbeeld:
var a = []int{1,2,3} var b = []int{1,2,3} printf("%v", a==b) // compileerfout: slice kan alleen met nil worden vergeleken
Om een waarde als sleutel in een map te gebruiken, moet deze vergelijkbaar zijn. Als het type niet overeenkomt — compilatiefout.
"Kunnen twee structuren als vergelijkbaar worden beschouwd, als slechts een deel van hun velden niet vergelijkbaar is?"
Veel mensen antwoorden "ja", maar dit is onjuist. Als zelfs maar één veld van de structuur niet vergelijkbaar is (bijvoorbeeld een slice of map), wordt de hele structuur niet vergelijkbaar.
Voorbeeld:
type T struct { A int S []string } var t1, t2 T t1 == t2 // compileerfout: slices zijn niet vergelijkbaar
Verhaal
Een ontwikkelaar probeerde een slice te gebruiken als sleutel voor een map om rekenresultaten in cache op te slaan, wat leidde tot een compilatiefout. Vervangen door een string met een expliciete serialisator — het probleem was opgelost.
Verhaal
Bij het toevoegen van een nieuw veld (type slice) aan een structuur die als sleutel in een woordenboek werd gebruikt, stopte het project plotseling met bouwen. Reden: de structuur werd nu niet-vergelijkbaar, maar niemand verwachtte dat dit binnenshuis in geneste structuren zou doorgaan.
Verhaal
Om een set van structuren met slices erin te maken, probeerden ze een map te gebruiken. Zonder de vergelijkingsregels te begrijpen, kregen ze veel runtime-fouten bij het vergelijken van elementen, maar de reden lag in het feit dat ze niet konden worden gecompileerd met zo'n sleutel.