суббота, 22 февраля 2020 г.

Карта (map) в Golang: создание, добавление, получение, удаление

Карты 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 печатает карты в порядке сортировки ключей, чтобы упростить тестирование.

Производительность и реализация

  • Карты основаны на хэш-таблицах.
  • Операции добавления, получения и удаления выполняются в постоянное ожидаемое время. Временная сложность операции добавления амортизируется.
  • Операторы сравнения == и != должны быть определены для типа ключа.

Читайте также:


Комментариев нет:

Отправить комментарий