Constanten (const) in Go worden tijdens de compilatiefase berekend en kunnen een impliciet type hebben. iota is een speciale identificator die wordt gebruikt om opeenvolgende waarden te genereren bij het declareren van constante blokken. iota wordt met één verhoogd binnen het blok bij elke nieuwe constante.
Toewijzing zonder type-aanduiding leidt ertoe dat de constante misschien niet het type krijgt dat de ontwikkelaar verwacht, vooral als deze deelneemt aan wiskundige of logische operaties. Dit kan leiden tot impliciete conversies en compileerfouten.
Voorbeeld:
type Level int const ( Low Level = iota // Low: Level == 0 Medium // Medium: Level == 1 High // High: Level == 2 ) // En als het type niet is opgegeven: const ( Foo = iota // Foo: int == 0 Bar // Bar: int == 1 )
Kan de waarde van een constante die iota gebruikt "getypeerd" zijn en welk type zal het zijn als het type niet expliciet is opgegeven?
Antwoord: Als het type niet expliciet is opgegeven, wordt de constante typeloos en krijgt ze het type dat uit de gebruiksomgeving wordt afgeleid (bijvoorbeeld int, als ze in wiskunde wordt gebruikt). Dit kan problemen opleveren bij het gebruik van type-aliases of wanneer strikte type-naleving nodig is.
Voorbeeld:
type Status uint8 const ( Ready Status = iota+1 // Ok // als we gewoon const Ready = iota+1 hadden verklaard - het type zou int zijn, niet Status )
Verhaal
Bij het serialiseren van de status via json, verklaarde de ontwikkelaar const met behulp van iota zonder expliciet type. Het resultaat - de serialisatie geeft int terug, en niet een leesbare string, waardoor de frontend de ontvangen waarde verkeerd begon te interpreteren.
Verhaal
In het project werd een type State (type State int) geïntroduceerd, maar de constanten bleven zonder type gedefinieerd. Dit leidde ertoe dat interfaces geen waarden van het type State konden accepteren, wat leidde tot vervelende bugs die samenhingen met type-inconsistentie bij het vergelijken van constanten en variabelen.
Verhaal
Een engineer voegde een nieuwe waarde van enum toe via iota, zonder het type op te geven. Hierdoor stond de compiler het vergelijken van de constante met elke andere variabele van type int toe, wat leidde tot takfouten in de businesslogica in productie.