Go’da Veri Yapıları

Go’da veri saklamak ve yönetmek için çeşitli veri yapıları mevcuttur. En yaygın kullanılanları inceleyelim.

Arrays (Diziler)

Arrays, sabit boyutlu koleksiyonlardır:

// 5 elemanlı int dizisi
var numbers [5]int
numbers[0] = 1
numbers[1] = 2

// Dizi tanımı ve başlatma
primes := [5]int{2, 3, 5, 7, 11}

Slices (Dilimler)

Slices, dinamik boyutlu dizilerdir ve Go’da en çok kullanılan veri yapıdır:

// Slice oluşturma
fruits := []string{"elma", "armut", "muz"}

// Eleman ekleme
fruits = append(fruits, "çilek")

// Dilimleme
numbers := []int{1, 2, 3, 4, 5}
subset := numbers[1:4]  // [2, 3, 4]

// Kapasite ve uzunluk
fmt.Println(len(fruits))  // 4
fmt.Println(cap(fruits))  // kapasite

Slice İşlemleri

// Copy - kopyalama
src := []int{1, 2, 3}
dst := make([]int, len(src))
copy(dst, src)

// Append - ekleme
slice := []int{1}
slice = append(slice, 2, 3)

Maps (Haritalar)

Maps, anahtar-değer çiftlerini saklar:

// Map oluşturma
ages := make(map[string]int)

// Değer atama
ages["Ahmet"] = 25
ages["Mehmet"] = 30

// Map tanımı ve başlatma
colors := map[string]string{
    "red":   "#ff0000",
    "green": "#00ff00",
    "blue":  "#0000ff",
}

// Değer okuma ve varlık kontrolü
if age, exists := ages["Ahmet"]; exists {
    fmt.Println("Ahmet:", age)
}

// Döngü ile gezinme
for name, age := range ages {
    fmt.Printf("%s: %d\n", name, age)
}

// Eleman silme
delete(ages, "Mehmet")

Hangisini Ne Zaman Kullanmalı?

Veri Yapısı Kullanım Senaryosu
Array Sabit boyutlu koleksiyonlar (örn: haftanın günleri)
Slice Dinamik listeler, belirsiz boyutlu koleksiyonlar
Map Anahtar-değer eşleşmeleri, hızlı arama

Performans İpuçları

  1. Slice pre-allocation: Kapasite biliyorsanız baştan belirtin

    items := make([]int, 0, 1000)  // kapasite 1000
    
  2. Map sizing: Map boyutu tahmin edilebiliorsa başlatın

    m := make(map[string]int, 100)
    
  3. Slice büyümesi: Tek seferde büyütün “`go // İyi items = append(items, newItems…)

// Kötü for _, item := range newItems { items = append(items, item) } “`