Ответ
Основное правило для ключей в 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"