Вопрос проверяет понимание различий между map и slice в Go, их внутреннего устройства и сценариев применения.
Slice и map — это две фундаментальные структуры данных в Go, каждая из которых предназначена для разных целей. Slice представляет собой динамический массив, который хранит элементы последовательно в памяти, обеспечивая быстрый доступ по индексу. Map — это хеш-таблица, которая хранит пары ключ-значение и позволяет быстро находить значение по ключу, но не гарантирует порядок элементов.
Slice состоит из трех компонентов: указателя на массив, длины и емкости. При добавлении элементов slice может автоматически расширяться, создавая новый массив большего размера. Map использует хеш-функцию для распределения ключей по корзинам, что обеспечивает среднюю сложность O(1) для операций вставки, поиска и удаления.
// Slice: упорядоченная коллекция чисел
numbers := []int{1, 2, 3}
numbers = append(numbers, 4) // добавляем элемент
fmt.Println(numbers[0]) // доступ по индексу: 1
// Map: поиск по ключу
ages := map[string]int{"Alice": 30, "Bob": 25}
ages["Charlie"] = 35 // добавляем пару
fmt.Println(ages["Alice"]) // поиск по ключу: 30
// Итерация по slice
for i, v := range numbers {
fmt.Println(i, v)
}
// Итерация по map (порядок не гарантирован)
for name, age := range ages {
fmt.Println(name, age)
}Вывод: Выбирайте slice для работы с последовательностями данных, где важен порядок, и map для ассоциативных массивов, где ключ — основной способ доступа. В большинстве реальных задач эти структуры дополняют друг друга.