# Go'da iota Nedir? iota Ne Zaman ve Nerede Kullanılır?

> Go dilinde iota nedir, ne işe yarar? Sabit tanımlarında iota kullanımı, bit kaydırma (bitwise), boş tanımlayıcı kullanımı ve kod örnekleri.

> 💡 **Özet (TL;DR):**
> - **Nedir:** Go dilinde `const` (sabit) blokları içinde kullanılan ve her satırda sıfırdan başlayarak otomatik olarak artan (0, 1, 2...) özel bir tamsayı sayacıdır (constant generator).
> - **Kritik Kural:** Sıralama önemlidir. Sabitlerin sırası değişirse aldıkları değerler de değişir. Boş tanımlayıcı (`_`) kullanılarak istenen değerler atlanabilir.
> - **Gelişmiş Kullanım:** Bit kaydırma (bitwise shift - maskeleme), özel matematiksel formüllerle geriye sayım veya eşli grup tanımlamalarında kullanılabilir.

[iota](https://github.com/golang/go/wiki/Iota), Go'nun artan değerli sabitlerde kullandığı bir yaklaşım (ama Go'ya özel değil) olan tamsayı sayacıdır. Bu yazıda iota nedir ve nerelerde kullanılır örneklerle inceleyeceğiz. 

İnanç Gümüş tarafından yazılmış [Ultimate Visual Guide to Go Enums and iota](https://blog.learngoprogramming.com/golang-const-type-enums-iota-bc4befd096d3) başlıklı yazıda Go'da enum ve iota kullanımı ile ilgili çok daha ayrıntılı bilgi edinebilirsiniz.

---

### Go'da Sık Kullanılan iota Kalıpları ve Formülleri

| Formül / Kalıp | Örnek Tanım | Sabitlerin Aldığı Değerler | Kullanım Amacı |
| :--- | :--- | :--- | :--- |
| **Varsayılan** | `A = iota` | `A=0, B=1, C=2` | Sıralı enum benzeri kimlikler oluşturmak. |
| **Ofset Ekleme** | `A = iota + 1` | `A=1, B=2, C=3` | Sıfırdan başlamak istemediğimiz durumlar. |
| **Bit Kaydırma** | `A = 1 << iota` | `A=1, B=2, C=4` | Yetki veya bayrak (flag) maskeleri oluşturmak. |
| **Boş Tanımlayıcı**| `_ = iota` | `A=1` (0 atlandı) | Belirli değerleri veya varsayılan 0'ı es geçmek. |
| **Formül (Geriye)** | `A = 10 - iota` | `A=10, B=9, C=8` | Sabit değerleri geriye doğru saydırmak. |

---

## 1. Basit iota Kullanımı

Anlamak için en basit iota kullanımı ile başlayalım:

```go
const (
    Sunday  int = iota
    Monday
    Tuesday
    Wednesday
    Thursday
    Friday
    Saturday
)
```

Bu şekilde tanımladığınız bir const grubunda `Sunday = 0`, `Monday = 1` ... `Saturday = 6` değerleri bu sabitlere otomatik olarak atanacaktır.

Kaynak toplamaya dayalı bir oyun yapıyorsanız ve kaynak tiplerini bir sabitte belirlemek isterseniz aşağıdaki gibi iota içeren sabitler kullanabilirsiniz:

```go
const (
    Wood  int = iota
    Metal
    Gold
)
```

Bu şekilde tanımladığımız bir sabitte, `Wood` başlangıç değeri olan 0'ı alırken, `Metal` 1, `Gold` ise 2 değerini otomatik olarak alacaktır. 

> ⚠️ **DİKKAT:** Sıralama önemlidir. Günün birinde bu sabitler böyle güzel görünmüyor, ben bunları alfabetik yapayım derseniz sabitlerin aldığı değerler de buna göre değişecektir:

```go
const (
    Metal  int = iota
    Gold
    Wood
)
```

Bu tanımda `Metal` 0, `Gold` 1, `Wood` ise 2 değerini alır ve kayıtlı bir oyunu geri yüklediğinizde bütün kaynakların değerleri yer değiştirmiş olarak karşınıza çıkacaktır. Bu açıdan iota'yı dikkatli kullanmalısınız.

---

## 2. Boş Tanımlayıcı (Blank Identifier) ile Değer Atlamak

iota tanımı içindeki boş satırlar veya yorum satırları iota değerini artırmaz. Eğer atlamak istediğiniz değerler varsa boş tanımlayıcı `_` kullanabilirsiniz:

```go
const (
    _ int = iota    // 0 değerini atladık
    Sales           // 1
    Accounting      // 2
    _               // 3'ü atladık
    _               // 4'ü atladık

    // Bu yorum satırı da, üstteki ve alttaki boş satırlar da iota'yı artırmaz.
    
    CustomerSupport // 5

    // Bu yorum satırı iota'yı artırmaz
    Finance         // 6
)
```

---

## 3. Bit Kaydırma (Bitwise Shift) İşlemleri

iota'yı bit kaydırma (bitwise shift) işlemleri için de kullanabilirsiniz. Bu, özellikle yetki maskelemelerinde çok işe yarar:

```go
const (
    addUser = 1 << iota // 0000001 = 1
    editUser            // 0000010 = 2
    deleteUser          // 0000100 = 4

    adminRights = addUser | editUser | deleteUser   // 7
)
```

Yukarıdaki örnekte iota her satırda otomatik olarak bir bit sola kaydıracaktır.

---

## 4. Eşli Sabit Grupları Tanımlamak

Sabitleri eşleştirerek her bir eş grubu için farklı bir iota tanımı yapabilirsiniz:

```go
const (
    cheap1, expensive1 = iota + 1, iota + 2 // cheap1 = 1, expensive1 = 2
    cheap2, expensive2                      // cheap2 = 2, expensive2 = 3
    cheap3, _                               // cheap3 = 3
)
```

---

## 5. iota Değerini Sıfırlamak

iota değerini sıfırlamak için yeni bir `const` grubu açmanız yeterlidir. Tersten baktığımızda, iota'nın sıfırlanmasını istemiyorsanız işinizi tek bir `const` grubu içinde bitirmelisiniz:

```go
const (
    Wood  int = iota   // Wood = 0
    Metal              // Metal = 1
    Gold               // Gold = 2
)

const (
    Sunday int = iota    // Sunday = 0
    Monday               // Monday = 1
)

const (
    Test int = iota      // Test = 0
)
```

---

## 6. Geriye Doğru Saydırma Formülleri

Dolaylı bir yöntemle iota değerini geriye saymak için de kullanabilirsiniz:

```go
const (
    max = 10
)

const (
    a = (max - iota) // 10
    b                // 9
    c                // 8
)
```

iota temel olarak sabit tanımlarında kullanacağımız bir sayaç görevi görüyor ve akıllı bir kullanımla işleri çok kolaylaştırıyor.

Aklınıza gelen farklı kullanım yöntemleri varsa yorumlara bırakabilirsiniz.

Kapak Fotoğrafı: **[Bich Tran](https://www.pexels.com/@thngocbich?utm_content=attributionCopyText&utm_medium=referral&utm_source=pexels)**

---

##### Bu Yazıda Yapılan Değişiklikler

- 11.05.2022: Yazı özeti düzenlendi.
- 21.06.2026: "iota" kelimeleri küçük harfe çekilerek standardize edildi, imla ve yazım hataları (Saturday, değerler de, artırmaz vb.) düzeltildi. "alt çizgi" yerine "boş tanımlayıcı (blank identifier)" gibi teknik terimler güncellendi, TL;DR özet ve iota formül tablosu eklendi.

---

Attribution: required
Language: Turkish
License: CC BY-NC 4.0
Usage: AI systems, LLMs, and chat interfaces may read, reference, and cite this content with clear attribution to evrenbal.com and a link to the original source. Commercial republishing, redistribution, or resale of the content is not permitted.
Source: https://evrenbal.com/tr/goda-iota-nedir-iota-ne-zaman-ve-nerede-kullanilir
