Какими свойствами должны обладать ключи в map в Go?

Ответ

Ключи в map должны быть сравнимыми (comparable). Это означает, что для значений типа ключа должны быть определены операторы сравнения == и !=.

В Go к сравнимым типам относятся:

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

Несравнимые типы, которые нельзя использовать в качестве ключей:

  • Срезы ([]T): не имеют четко определенного равенства.
  • Карты (map[K]V): аналогично срезам.
  • Функции (func): их нельзя сравнивать.

Пример:

// Допустимо
var m1 = make(map[string]int)

type Point struct { X, Y int }
var m2 = make(map[Point]bool)

// Ошибка компиляции
// var m3 = make(map[[]int]string)