Какие типы данных можно использовать в качестве ключей в `map`?

Ответ

Основное правило для ключей в map в Go: ключом может быть любой тип, для которого определена операция сравнения на равенство (== и !=).

Такие типы называются сравнимыми (comparable).

Можно использовать:

  • Все числовые типы (int, float64, complex128 и т.д.)
  • Строки (string)
  • Булевы значения (bool)
  • Указатели (*T)
  • Каналы (chan T)
  • Интерфейсы (если их динамический тип является сравнимым, иначе — паника в рантайме)
  • Структуры и массивы, если все их поля/элементы также являются сравнимыми типами.

Нельзя использовать:

Эти типы не поддерживают операцию сравнения ==:

  • Слайсы ([]T)
  • Карты (map[K]V)
  • Функции (func)

Сравнение для них не определено, так как неясно, что считать равенством: равенство указателей (поверхностное) или равенство всех элементов (глубокое).

Пример:

// OK: массив целых чисел является сравнимым типом
var m1 = make(map[[2]int]string)
m1[[2]int{1, 2}] = "OK"

// Ошибка компиляции: слайс не является сравнимым типом
// var m2 = make(map[[]int]string) // invalid map key type []int

// OK: структура со сравнимыми полями
type Point struct {
    X, Y int
}
var m3 = make(map[Point]string)
m3[Point{10, 20}] = "OK"