Карты Go реализованы с помощью хэш-таблиц и имеют эффективные операции добавления, получения и удаления.
Создание новой карты
var m map[string]int // nil карта
// string-int пар
m1 := make(map[string]float64) // пустая карта
// string-float64 пар
m2 := make(map[string]float64, 100) // преаллоцируем место
// для 100 вхождений
m3 := map[string]float64{ // литерал карты
"e": 2.71828,
"pi": 3.1416,
}
fmt.Println(len(m3)) // размер карты: 2
- Карта (или словарь) - это неупорядоченная коллекция пар ключ-значение, где каждый ключ уникален.
- Вы создаете новую карту с оператором make или литералом карты.
- Нулевым значением по умолчанию для карты является nil. nil карта эквивалентна пустой карте, за исключением того, что элементы не могут быть добавлены.
- Функция len возвращает размер карты, который представляет собой количество пар ключ-значение.
Предупреждение: если вы попытаетесь добавить элемент в неинициализированную карту, вы получите загадочную ошибку времени выполнения (run-time error) Присвоение к вхождению в nil-карте (assignment to entry in nil map).
Добавление, обновление, получение, удаление ключа/значения
m := make(map[string]float64)
m["pi"] = 3.14 // Добавляем новую пару
// ключ-значение
m["pi"] = 3.1416 // Обновляем значение
fmt.Println(m) // Печатаем карту:
// "map[pi:3.1416]"
v := m["pi"] // Получаем значение:
// v == 3.1416
v = m["pie"] // Не найдено:
// v == 0 (нулевое значение)
_, found := m["pi"] // found == true
_, found = m["pie"] // found == false
if x, found := m["pi"]; found {
fmt.Println(x)
} // Печатает "3.1416"
delete(m, "pi") // Удаляем пару ключ-значение
fmt.Println(m) // Печатаем карту: "map[]"
- Когда вы индексируете карту, вы получаете два возвращаемых значения; второе (необязательное) является логическим значением, указывающим, существует ли ключ.
- Если ключ не существует, первое значение будет нулевым значением по умолчанию.
For-each range цикл
m := map[string]float64{
"pi": 3.1416,
"e": 2.71828,
}
fmt.Println(m) // "map[e:2.71828 pi:3.1416]"
for key, value := range m { // Порядок не определен
fmt.Println(key, value)
}
- Порядок итераций не указан и может варьироваться от итерации к итерации.
- Если запись, которая еще не была достигнута, удаляется во время итерации, соответствующее значение итерации не будет создано.
- Если запись создается во время итерации, эта запись может создаваться или не создаваться во время итерации.
Начиная с Go 1.12, пакет fmt печатает карты в порядке сортировки ключей, чтобы упростить тестирование.
Производительность и реализация
- Карты основаны на хэш-таблицах.
- Операции добавления, получения и удаления выполняются в постоянное ожидаемое время. Временная сложность операции добавления амортизируется.
- Операторы сравнения == и != должны быть определены для типа ключа.
Читайте также:
Комментариев нет:
Отправить комментарий