ProgrammatieGo-ontwikkelaar

Welke datatypes in Go worden als vergelijkbaar (comparable) beschouwd en wat gebeurt er als je probeert niet-vergelijkbare types te vergelijken? Hoe beïnvloedt dit het gebruik van map en set?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord

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:

  • Alle numerieke types (int, float64, ...)
  • Tekens (string, rune)
  • Pointers
  • Kanalen
  • Interfaces, als hun waarden vergelijkbaar zijn
  • Arrays en structuren, als al hun velden vergelijkbaar zijn

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.

Vraag met een draai

"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

Voorbeelden van echte fouten door het onwetend zijn van de nuances van het onderwerp


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.