В чем ключевые различия между `map` и `slice` в Go?

Ответ

map и slice — это две фундаментальные встроенные структуры данных в Go, но они служат разным целям.

Слайс (slice) — это обертка над массивом, представляющая собой динамическую, упорядоченную последовательность элементов одного типа.

Мапа (map) — это неупорядоченная коллекция пар ключ-значение, где все ключи имеют один тип, а все значения — другой.

ХарактеристикаСлайс (slice)Мапа (map)
СтруктураУпорядоченная последовательностьНеупорядоченная коллекция ключ-значение
ДоступПо целочисленному индексу (начиная с 0)По уникальному ключу (любого сравнимого типа)
Нулевое значениеnil. К nil-слайсу можно добавлять элементы (append)nil. Запись в nil-мапу вызовет панику. Чтение вернет нулевое значение для типа значения.
ПроизводительностьДоступ по индексу: O(1). Добавление: O(1) в среднем, но может быть O(n) при реаллокации.Доступ, вставка, удаление: O(1) в среднем (амортизированная сложность).
Пример использованияСписок пользователей, буфер данных, любая упорядоченная коллекция.Кэш, словарь, хранение конфигурации, поиск по идентификатору.

Пример в коде:

// Слайс: упорядоченная коллекция, доступ по индексу
users := []string{"Alice", "Bob", "Charlie"}
fmt.Println(users[1]) // Выведет "Bob"

// Мапа: неупорядоченная коллекция, доступ по ключу
userAges := map[string]int{
    "Alice": 25,
    "Bob":   30,
}
fmt.Println(userAges["Alice"]) // Выведет 25