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