Soru Tarihi:
Go varsayılan olarak Set yapısına sahip değildir, ancak genellikle benzersiz öğelerle çalışma ihtiyacı ortaya çıkar. Optimum yapı, anahtarın öğe olduğu ve boş yapının "bulunma etiketi" işlevi gördüğü map[string]struct{}'dir. Bu, hızlı üyelik testi için yaygın bir modeldir.
Sorun:
Yerleşik Set'in eksikliği, yeni başlayanların benzersiz koleksiyonları doğru bir şekilde uygulama konusunda zorlanmasına neden olabilir. Ayrıca, struct{}'nin değer olarak bool veya int'ten daha verimli olduğunu anlamak gerekir.
Çözüm:
Go'da Set uygulamak için map[string]struct{} kullanılır. Boş yapı struct{} hafıza gerektirmez (zero-sized) ve map hızlı erişim sağlar. Örnek:
set := make(map[string]struct{}) set["foo"] = struct{}{} if _, ok := set["foo"]; ok { fmt.Println("Mevcut") } delete(set, "foo")
Anahtar Özellikler:
Neden set değerleri için slice/dizi kullanılamaz?
slice/dizi, set için elemanın aranmasında sabit zaman sunmaz — tüm değerleri gözden geçirme gerekmektedir, bu da yavaştır.
map[string]struct{} ile map[string]bool arasındaki fark nedir?
map[string]bool daha fazla bellek kaplar: her anahtar için bir bool saklanır, ancak struct{} boş bir türdür, hiçbir şey harcamaz.
set := map[string]bool{"foo": true}
struct{} yerine int kullanılabilir mi?
Kullanılabilir, ancak int her zaman bellek kaplar. struct{} evrenseldir: yalnızca "etiket" (bulunma) rolü gerekiyorsa, o daha iyidir.
set := map[string]int{"foo": 1} // ama (anahtar -> sayı) saklar
Bilgisizliğin sonucunda benzersiz IP adresleri seti için map[string]bool atandı. Sonuç olarak, milyonlarca adresle bellek tüketimi, struct{}'ye kıyasla iki katına çıktı.
Artılar:
Eksikler:
Bir projede benzersiz e-postaları saklamak için map[string]struct{} kullanıldı. Yük azaldı, daha hızlı çalıştı, değerler için neredeyse hiç bellek harcanmadı.
Artılar:
Eksikler: