Ответ
map
в Go — это встроенный тип данных, реализующий хеш-таблицу для хранения пар «ключ-значение».
Основное назначение
map
используется, когда нужен быстрый доступ к данным по уникальному ключу. Это аналог словарей (dictionaries) в Python или хеш-мапов (HashMap) в Java.
Типичные задачи:
- Кэширование данных.
- Подсчет частоты элементов (например, слов в тексте).
- Хранение конфигураций или настроек.
- Быстрый поиск объектов по их идентификатору.
Ключевые характеристики и особенности
- Скорость доступа: Обеспечивает быстрый поиск, вставку и удаление элементов. В среднем сложность этих операций — O(1).
- Неупорядоченность: Порядок итерации по элементам
map
не гарантируется и может меняться от запуска к запуску. Если важен порядок, следует использовать слайс структур или дополнительный слайс ключей. - Не потокобезопасность: Встроенный тип
map
не является потокобезопасным. Для конкурентного доступа из нескольких горутин необходимо использовать мьютекс (sync.RWMutex
) илиsync.Map
. - Нулевое значение: Нулевое значение для
map
— этоnil
. Изnil
-карты можно читать (всегда вернется нулевое значение для типа значения), но попытка записи вnil
-карту вызовет panic.
Пример использования
package main
import "fmt"
func main() {
// Инициализация
users := make(map[int]string)
// Запись
users[1] = "Alice"
users[2] = "Bob"
// Чтение и проверка наличия ключа (идиома "comma ok")
if name, ok := users[1]; ok {
fmt.Printf("Пользователь с ID 1: %sn", name) // Пользователь с ID 1: Alice
}
if _, ok := users[99]; !ok {
fmt.Println("Пользователь с ID 99 не найден.") // Пользователь с ID 99 не найден.
}
// Удаление
delete(users, 2)
// Итерация (порядок не гарантирован)
for id, name := range users {
fmt.Printf("ID: %d, Name: %sn", id, name)
}
// Попытка записи в nil-карту
var nilMap map[int]string
// nilMap[1] = "test" // вызовет panic: assignment to entry in nil map
}