Sebastian'ın cevabı doğru, ancak neden güvenli olduğunu bilmek istedim , bu yüzden Harita kaynak kodunu biraz araştırdım . Bir çağrıda göründüğü gibi, delete(k, v)değeri gerçekten silmek yerine temelde sadece bir bayrak belirler (sayma değerini değiştirmenin yanı sıra):
b->tophash[i] = Empty;
(Boş, değer için sabittir 0)
Haritanın gerçekte yaptığı şey, haritanın boyutuna bağlı olarak, 2^B( bu kaynak koddan ) oranında ekleme gerçekleştirdikçe büyüyen belirli sayıda kova ayırmaktır :
byte *buckets; // array of 2^B Buckets. may be nil if count==0.
Dolayısıyla, neredeyse her zaman kullandığınızdan daha fazla kova tahsis edilir rangeve harita üzerinde bir yaptığınızda tophash, her bir bölümün değerini 2^B, atlayıp atlayamayacağını görmek için kontrol eder .
Özetlemek gerekirse, a'nın deleteiçi rangegüvenlidir, çünkü veriler teknik olarak hala oradadır, ancak kontrol ettiğinde, tophashonu atlayabileceğini ve rangegerçekleştirdiğiniz işleme dahil etmeyebileceğini görür . Kaynak kodu şunları da içerir TODO:
// TODO: consolidate buckets if they are mostly empty
// can only consolidate if there are no live iterators at this size.
Bu, delete(k,v)işlevi kullanmanın neden hafızayı gerçekten boşaltmadığını, yalnızca onu erişmenize izin verilen paketler listesinden kaldırdığını açıklar . Eğer gerçek hafızayı boşaltmak istiyorsanız, çöp toplama işleminin devreye girmesi için tüm haritayı erişilemez hale getirmeniz gerekir. Bunu aşağıdaki gibi bir satır kullanarak yapabilirsiniz:
map = nil