Go'daki sabitler (const), derleme aşamasında hesaplanır ve dolaylı bir tür alabilir. iota, sabit blokları tanımlarken ardışık değerleri oluşturmak için kullanılan özel bir tanımlayıcıdır. iota her yeni sabit için blok içinde birer birer artar.
Tür belirtilmeden atama yapmak, sabitin beklenilen türü almasını engelleyebilir, özellikle matematik veya mantık işlemlerinde kullanıldığında. Bu dolaylı dönüşümlere ve derleme hatalarına yol açabilir.
Örnek:
type Level int const ( Low Level = iota // Low: Level == 0 Medium // Medium: Level == 1 High // High: Level == 2 ) // Eğer tür belirtilmezse: const ( Foo = iota // Foo: int == 0 Bar // Bar: int == 1 )
Tür belirtilmeden iota kullanımıyla bir sabitin "tipleştirilmesi" mümkün mü ve bu sabitin tipi ne olur?
Cevap: Tür açıkça belirtilmezse, sabit tipine sahip olmaktan çıkar ve kullanım bağlamına göre çıkarılan türü alır (örneğin, aritmetikte kullanılıyorsa int olur). Bu, tür aliasları kullanıldığında veya sıkı tip gereksinimleri olduğunda sorunlara yol açabilir.
Örnek:
type Status uint8 const ( Ready Status = iota+1 // Tamam // Eğer sadece const Ready = iota+1 olarak tanımlansaydı — tür int olurdu, Status değil )
Hikaye
JSON üzerinden durumu serileştiren bir geliştirici, açık tür olmadan iota kullanarak sabitler tanımladı. Sonuç — serileştirme, insan tarafından okunabilir bir dize yerine int dönüyor, bu nedenle frontend gelen değeri yanlış yorumlamaya başladı.
Hikaye
Projede State (type State int) tipi tanımlandı, ancak sabitler açık tür olmadan bırakıldı. Bu, arabirimlerin State türündeki değerleri alamamasına yol açtı ve sabitler ile değişkenler arasında tür uyuşmazlığı nedeniyle rahatsız edici hatalar ortaya çıktı.
Hikaye
Bir mühendis, türü belirtmeden iota aracılığıyla yeni bir enum değeri ekledi. Sonuç olarak derleyici, sabiti int türündeki herhangi bir değişken ile karşılaştırmaya izin verdi, bu da üretimde iş mantığı dalgalanmalarına neden oldu.