Go'da struct{} tipi, alanı olmayan bir yapı temsil eder ve 0 bayt bellek kaplar. Bu, kaynak kullanımını minimize etmek için değerli bir özellik olup, bir şeyin varlığı önem taşıdığında fakat veriye ihtiyaç olmadığında kullanılır — örneğin, kümelerin (set), sinyalizasyon yapıların veya etkinlikler için kanalların uygulanmasında.
Küme için kullanım örneği:
mySet := make(map[string]struct{}) mySet["foo"] = struct{}{} if _, ok := mySet["foo"]; ok { fmt.Println("foo mySet içinde mevcut") }
struct{} bir değer olarak, anahtarın varlığını göstermek için kullanılır.map[string]bool ile karşılaştırıldığında, struct{} seçeneği bellek açısından daha ekonomiktir.Sinyalizasyon kanalları:
done := make(chan struct{}) // Goroutine, bitiş sinyalini bekler <-done
Küme uygulanması sırasında map[string]struct{} ile map[string]bool arasındaki fark nedir? Neden map[string]struct{} tercih edilir ve dezavantajları var mıdır?
Cevap:
map[string]struct{} değer başına 0 bayt kullanır, en kompakt seçenektir — özellikle büyük veri kümeleri durumunda bellek tasarrufu sağlar.map[string]bool değer başına 1 bayt gerektirir (içsel olarak hizalama nedeniyle daha fazla bellek kaplayabilir).map[string]struct{}'in dezavantajı: eğer bir mantıksal değere ihtiyaç duyulursa, true olan tüm değerlerin hızlı bir şekilde listesini alamazsınız. Anahtarlarda yine döngü yapmak zorundasınız.Örnek:
set := make(map[string]struct{}) set["Alice"] = struct{}{} _, exists := set["Alice"] // true flags := make(map[string]bool) flags["Alice"] = true _, exists := flags["Alice"] // true
Hikaye
Benzersiz kimliklerin depolandığı projede map[string]bool kullanıldı, bu da verilerin artmasıyla birlikte bellek tüketiminde önemli bir artışa neden oldu — map[string]struct{} seçeneği ile karşılaştırıldığında yüzlerce megabayta çıktı. struct{}'ya geçmek bellek tüketimini iki katına kadar azalttı.
Hikaye
Yeni başlayan bir programcı goroutine'in sonlandığını
chan boolüzerinden haber verdi. Çok sayıda goroutine olması durumunda, değerlerin iletilmesi gereksiz bir yük haline geldi:trueveyafalsegelip gelmediği hiçbir yerde incelenmedi.chan struct{}ile değiştirmek mimari bir hatayı gösterdi ve kodun sadeleşmesini sağladı.
Hikaye
Bir kütüphanede, bir küme oluşturmak için map kullanılıp değer olarak string kullanıldı. Bu çok fazla bellek kapladı. Kod İncelemesi sonrası map[tip]struct{}'ya geçildi. Hata, yük testi sırasında bellek profili analiz edildiğinde, uygulamanın OOM yüzünden çökmesiyle ortaya çıktı.