Sobes.tech
Middle

Go'da Map nasıl çalışır?

sobes.tech yapay zeka

AI'dan gelen yanıt

Go'da map, bir karma tablosu olarak uygulanır.

map yapısının temel bileşenleri:

  • Hash fonksiyonu: Anahtarları hash değerlerine (tam sayılar) dönüştürür.
  • Bucket dizisi: Anahtar-değer çiftlerinin saklandığı liste veya dizilerden oluşur. Bucket'ın indeksi, anahtarın hash değerine göre belirlenir.
  • Çakışma yönetimi: Farklı anahtarlar aynı hash'e sahipse (çakışma), bu öğeler aynı buckette saklanır, genellikle bağlı liste veya taşma bucket'ında.
  • Yükleme faktörü: Öğelerin sayısı ile bucket sayısı arasındaki oran. Belirli bir eşik aşıldığında, yeniden karma (rehashing) yapılır: yeni, daha büyük bir bucket dizisi oluşturulur ve eski bucket'lardaki tüm öğeler yeni dizilere taşınır.

Go'daki map yapısı, hmap tipiyle temsil edilir:

 type hmap struct {
    count     int // Öğelerin sayısı
    flags     uint8 // Durum bayrakları
    B         uint8 // log_2 bucket sayısı (bucket sayısı 2^B)
    noverflow uint16 // Taşmış bucket sayısı (sadece istatistik için)
    hash0     uint32 // Hash fonksiyonunun başlangıç değeri

    buckets    unsafe.Pointer // Bucket dizisine işaretçi (ana ve taşma bucket'ları)
    oldbuckets unsafe.Pointer // Göç sırasında eski bucket dizisine işaretçi
    nevacuate  uintptr // Eski bucket'ta göçün tamamlandığı yer

    extra *mapextra // Ek bilgi (isteğe bağlı)
}

 type mapextra struct {
    overflow    *[2]*[]*bmap // Taşma bucket dizilerine işaretçiler
    oldoverflow *[2]*[]*bmap // Eski taşma bucket dizilerine işaretçiler
    nextOverflow *bmap // Sonraki boş taşma bucket'ı
}

 type bmap struct {
    tophash [8]uint8 // Üst hash (hash'in üst bitleri) arama hızını artırmak için
    // Sonra anahtarlar, değerler ve sonraki bmap'e işaretçiler (bucket taşmışsa)
    // Tüm verileri hmap.buckets için tek bir malloc bloğunda düzenle
    // detaylar için ../../runtime/map.go'ya bakın
}

İşlemler:

  • Ekleme/Güncelleme: Anahtarın hash'i hesaplanır, bucket belirlenir. Anahtar zaten varsa, değer güncellenir. Aksi takdirde, anahtar-değer çifti bucket'a eklenir. Taşma veya Yükleme Faktörü aşımı durumunda yeniden karma yapılabilir.
  • Arama: Anahtarın hash'i hesaplanır, bucket belirlenir. Bucket'taki öğeler top-hash'e göre taranır, sonra anahtarlar tam olarak karşılaştırılır. Değer ve varlık durumu döndürülür.
  • Silme: Anahtarın hash'i hesaplanır, bucket belirlenir. Öğe, silinmiş olarak işaretlenir (ancak hemen bellekten silinmez). Silme, sonraki işlemler veya yeniden karma sırasında gerçekleşir.

Go'daki map, senkronize edilmemiştir ve dış senkronizasyon olmadan birden fazla goroutine tarafından güvenli şekilde kullanılamaz.