Ответ
Ключи в 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)