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.