Ответ
map в Go — это встроенный тип данных, который представляет собой неупорядоченную коллекцию пар "ключ-значение".
Основные характеристики:
- Неупорядоченность: Порядок итерации по элементам
mapне гарантирован и может меняться от запуска к запуску. Нельзя полагаться на порядок элементов. - Динамический размер:
mapавтоматически растет по мере добавления новых элементов. - Типы ключей: Ключом может быть любой тип данных, для которого определена операция сравнения (
==и!=), например:string,int,float, указатели, структуры (если все их поля сравнимы). - Нулевое значение: Нулевое значение для
map— этоnil. Попытка записи вnil-мапу вызовет панику. Чтение изnil-мапы безопасно и всегда возвращает нулевое значение для типа значения. - Создание: Создается с помощью функции
make(map[KeyType]ValueType)или через литералmap[KeyType]ValueType{}.
Важнейшее ограничение: Потокобезопасность
Стандартные map в Go не являются потокобезопасными. Одновременное чтение и запись (или две записи) из разных горутин без дополнительной синхронизации приведет к состоянию гонки (race condition) и непредсказуемому поведению. Для конкурентного доступа необходимо использовать мьютекс (sync.RWMutex) или специализированный тип sync.Map.
Пример использования:
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
}
// Удаление элемента
delete(users, 2)
// Итерация (порядок не гарантирован)
for id, name := range users {
fmt.Printf("ID: %d, Name: %sn", id, name)
}
}