🟢 Лёгкий · 1 очк. Разное / продвинутое
Почему для множества (set) в Go используют map[K]struct{} вместо map[K]bool?
A struct{} занимает 0 байт памяти, а bool - 1 байт на каждый элемент; при большом количестве ключей разница существенна
B struct{} быстрее при поиске
C map[K]bool не компилируется
D Нет разницы, это вопрос стиля
Объяснение вопроса

struct{} - пустая структура, размер которой равен 0 байт. Это делает map[K]struct{} идеальным для множества:

// Множество строк
seen := make(map[string]struct{})

// Добавление
seen["alice"] = struct{}{}

// Проверка принадлежности
if _, ok := seen["alice"]; ok {
    fmt.Println("exists")
}

// Удаление
delete(seen, "alice")

Сравнение с map[string]bool:

  • struct{} - 0 байт на значение, bool - 1 байт
  • При 1 млн ключей экономия ~1 МБ
  • struct{} явно выражает семантику: "нас интересует только наличие ключа"
  • bool может быть удобнее: if seen["alice"] (не нужна запятая-ok)

На практике для небольших множеств разницы нет; для больших - struct{} предпочтительнее. Также chan struct{} используется для сигнальных каналов.

🧠Квиз 🏆Лидеры 🎯Собесед. 📖Вопросы 📚База зн.