ProgramlamaGo Geliştiricisi

Go'da map[string]struct{} nasıl set olarak çalışır ve bu kullanımın özellikleri nelerdir?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

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:

  • struct{} 0 byte alır — ekonomik bir uygulama
  • map anahtarla O(1) erişim sağlar
  • Elemanların tekrar etmemesi, Set semantiği kolayca uygulanabilir

Kandırıcı Sorular.

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

Tipik Hatalar ve Antipatörler

  • Gereksiz yere değerler için bool veya int kullanmak
  • Elemanın varlığını kontrol etmek için slice kullanmak (kontrolleri yavaşlatır)
  • Elemanları delete ile silmeyi unutmak

Hayattan Bir Örnek

Olumsuz Durum

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:

  • Anlam bakımından açık (true == var)

Eksikler:

  • Performans daha düşük
  • Bellek kullanımı daha fazla

Olumlu Durum

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:

  • Minimum overhead
  • Büyük sayıda öğe üzerindeki performans

Eksikler:

  • Yeni başlayanlar için daha az belirgin, kodda yorum gerektiriyor.