Soru Tarihi:
Go'daki sabitler, dilin ayrılmaz bir parçasıdır. Otomatik numaralandırma ile gruplanmış sabitler için, mantıksal olarak ilişkili değerlerin bildirilmesini kolaylaştırmak amacıyla iota tanımlayıcı kullanılır. Bu, Go'nun en erken sürümlerinde mevcut olmuştur.
Sorun:
Birçok geliştirici, iota ile çalışırken, nerede ve nasıl arttığını ve karmaşık tanım desenlerinde nasıl uygulandığını yanlış anlamaktadır. Bu, basit enum benzeri yapıların bile yanlış değerlere yol açmasına neden olur.
Çözüm:
iota, ardışık sabitleri bildirmeyi ve bit bayraklarını kullanışlı bir şekilde toplamayı sağlar. Her yeni sabit grubu için sıfırdan başlar. Her yeni const bloğu veya blokta yeni bir satır iota değerini artırır.
Kod örneği:
// iota ile bayrak maskesi ve enum örneği const ( _ = iota // sıfırı atla FlagRead // 1 FlagWrite // 2 FlagExecute // 3 ) const ( ( // bit bayrakları FlagA = 1 << iota // 1 << 0 = 1 FlagB // 1 << 1 = 2 FlagC // 1 << 2 = 4 ) )
Anahtar özellikler:
iota, const bloğunun dışında veya grupta olmayan bir sabit tanımı ile artabilir mi?
Hayır, iota sadece const grubunun içinde çalışır. Tekil bir tanımda her zaman değer 0 olacaktır.
const A = iota // 0 const B = iota // 0 (yeni blok)
Grup içinde tüm değerler iota kullanmazsa ne olur?
Sadece açıkça belirtilenler yeni değer alır, diğerleri önceki satırın ifadesini alır.
const ( A = iota // 0 B // 1 C = 10 // 10 D // 10 (iota değil, C'den ifade tekrarı) )
iota kullanarak bit maskeleri nasıl tanımlanır?
Bit maskeleri, kaydırmalarla gerçekleştirilir: 1 << iota.
const ( F1 = 1 << iota // 1 F2 // 2 F3 // 4 )
Mühendis, farklı gruplarda bit bayrakları tanımlıyor, iota'nın sayacı devam ettireceğini düşünüyor:
const ( FlagA = 1 << iota // 1 FlagB // 2 ) const ( FlagC = 1 << iota // 1 – beklenenden 3 değil! )
Artılar:
Eksiler:
Tüm ilişkili sabitler bir grupta toplanıyor:
const ( FlagA = 1 << iota FlagB FlagC )
Artılar:
Eksiler: