Stałe (const) w Go są obliczane na etapie kompilacji i mogą mieć niejawny typ. iota to specjalny identyfikator, który jest używany do generowania kolejnych wartości przy deklaracji bloków stałych. iota zwiększa się o jeden w obrębie bloku przy każdej nowej stałej.
Przypisanie bez wskazania typu prowadzi do sytuacji, w której stała może zyskać inny typ, niż oczekuje programista, szczególnie jeśli bierze udział w operacjach arytmetycznych lub logicznych. Może to prowadzić do niejawnych konwersji i błędów kompilacji.
Przykład:
type Level int const ( Low Level = iota // Low: Level == 0 Medium // Medium: Level == 1 High // High: Level == 2 ) // A jeśli nie wskaźymy typu: const ( Foo = iota // Foo: int == 0 Bar // Bar: int == 1 )
Czy wartość stałej wykorzystującej iota może być „typizowana” i jakim typem będzie, jeśli typ nie zostanie jawnie określony?
Odpowiedź: Jeśli typ nie zostanie jawnie określony, stała staje się typem beztypowym i zyskuje typ wywnioskowany z kontekstu użycia (na przykład int, jeśli jest używana w arytmetyce). Może to prowadzić do problemów przy używaniu aliasów typów lub w sytuacji wymagającej ścisłej typizacji.
Przykład:
type Status uint8 const ( Ready Status = iota+1 // Ok // gdybyśmy zadeklarowali po prostu const Ready = iota+1 — typ byłby int, nie Status )
Historia
Podczas serializacji statusu przez json, programista zadeklarował const za pomocą iota bez jawnego typu. Wynik — serializacja zwraca int, a nie czytelną dla człowieka ciąg, co spowodowało, że frontend zaczął błędnie interpretować otrzymaną wartość.
Historia
W projekcie wprowadzono typ State (type State int), ale stałe pozostały zadeklarowane bez typu. Doprowadziło to do sytuacji, w której interfejsy nie mogły akceptować wartości typu State, co prowadziło do nieprzyjemnych błędów związanych z niezgodnością typów podczas porównywania stałych i zmiennych.
Historia
Inżynier dodał nową wartość enum przez iota, nie określając typu. W wyniku tego kompilator zezwalał na porównywanie stałej z dowolną inną zmienną typu int, co prowadziło do błędów w logice biznesowej na produkcji.