0Pricing
Go Academy · Урок

Отображения: хранилища пар ключ-значение

Создание, чтение, запись и удаление элементов отображения

«Отображения: хранилища пар ключ-значение» — бесплатный урок Go Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Go Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Go Academy содержит 4 уроков всего.

Что такое отображение

Отображение в Go — это неупорядоченная коллекция пар «ключ — значение». Ключи должны иметь сравнимый тип (строки, целые числа и т. д.). Отображения являются ссылочными типами, основанными на хеш-таблице.

Создание отображений

Используйте литерал или make:

package main
import "fmt"

func main() {
    ages  := map[string]int{"Alice": 30, "Bob": 25}
    cache := make(map[string]string)
    fmt.Println(ages, cache)
}

Чтение и запись

Получайте значения с помощью m[key], а присваивайте их с помощью m[key] = value. Чтение отсутствующего ключа возвращает нулевое значение:

package main
import "fmt"

func main() {
    m := map[string]int{}
    m["hits"] = 10
    m["hits"]++
    fmt.Println(m["hits"])    // 11
    fmt.Println(m["missing"]) // 0
}

Проверка существования ключа

Форма с двумя значениями позволяет отличить отсутствующий ключ от нулевого значения:

package main
import "fmt"

func main() {
    m := map[string]int{"a": 0}
    v, ok := m["a"]
    fmt.Println(v, ok) // 0 true
    v2, ok2 := m["z"]
    fmt.Println(v2, ok2) // 0 false
}

Удаление записей

Используйте встроенную функцию delete. Удаление несуществующего ключа ничего не делает:

package main
import "fmt"

func main() {
    m := map[string]int{"x": 1, "y": 2}
    delete(m, "x")
    delete(m, "z") // no-op
    fmt.Println(m) // map[y:2]
}

Перебор отображения

Для перебора используйте range. Порядок не гарантируется:

package main
import "fmt"

func main() {
    scores := map[string]int{"Alice": 90, "Bob": 85}
    for name, score := range scores {
        fmt.Printf("%s: %d\n", name, score)
    }
}

Отображения со значениями-структурами

Отображения могут хранить структуры в качестве значений. Обновляйте их через временную переменную (структуры в отображениях не являются адресуемыми):

package main
import "fmt"

type Point struct{ X, Y int }

func main() {
    points := map[string]Point{"A": {1, 2}}
    p := points["A"]
    p.X = 99
    points["A"] = p
    fmt.Println(points["A"]) // {99 2}
}

Нулевые отображения

Чтение из нулевого отображения выполняется так же, как из пустого отображения (возвращаются нулевые значения), но запись в нулевое отображение вызывает панику:

package main

func main() {
    var m map[string]int
    _ = m["key"]   // ok — returns 0
    // m["key"] = 1 // PANIC: assignment to nil map
}

Отображения небезопасны для параллельного использования

Встроенное отображение Go не является безопасным при работе из нескольких горутин. Параллельное чтение допустимо, но для параллельной записи (или одновременных чтения и записи) требуется мьютекс или sync.Map:

package main
import "sync"

func main() {
    var mu sync.Mutex
    m := map[string]int{}
    mu.Lock()
    m["key"] = 1
    mu.Unlock()
    _ = m
}

Подсчёт частот

Классический шаблон использования отображения — подсчёт количества вхождений:

package main
import "fmt"

func main() {
    words := []string{"go", "is", "fast", "go", "is", "go"}
    freq := map[string]int{}
    for _, w := range words {
        freq[w]++
    }
    fmt.Println(freq) // map[fast:1 go:3 is:2]
}

Быстрая проверка

Что происходит при чтении ключа, которого нет в отображении Go?

Итоги: отображения

Основные выводы:

  • Отображения — это неупорядоченные хранилища пар «ключ — значение»
  • Используйте форму с двумя значениями, чтобы проверить существование ключа
  • Никогда не записывайте данные в нулевое отображение
  • Порядок перебора случаен — при необходимости отсортируйте ключи
  • Защищайте отображения мьютексом в параллельном коде

Задание для практики

Напишите функцию, которая принимает строку и возвращает map[rune]int, подсчитывая, сколько раз встречается каждый символ. Проверьте её на строке "hello".

Часто задаваемые вопросы

Урок «Отображения: хранилища пар ключ-значение» бесплатный?

Да — полный текст урока «Отображения: хранилища пар ключ-значение» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Go Academy, подпишись на CoddyKit PRO. Курс Go Academy содержит 4 уроков всего.

Чему я научусь в уроке «Отображения: хранилища пар ключ-значение»?

Создание, чтение, запись и удаление элементов отображения Ты практикуешь Go Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Go Academy?

Предыдущий опыт не требуется. Go Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Отображения: хранилища пар ключ-значение»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Go Academy?

Да. Каждый урок Go Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Массивы: коллекции фиксированной длины
  2. Срезы: динамические списки
  3. Отображения: хранилища пар ключ-значение
  4. Итерация по коллекциям с range
← Назад к Go Academy