Ответ
Ключом в map
может быть любой сравнимый (comparable) тип данных. Это требование связано с тем, что map
для своей работы должна уметь проверять ключи на равенство (==
).
Допустимые типы ключей:
- Все числовые типы (
int
,float64
и т.д.) string
bool
- Указатели (
*T
) - Каналы (
chan T
) - Интерфейсы (если базовый тип сравним)
- Структуры, если все их поля являются сравнимыми типами
- Массивы, если тип их элементов является сравнимым
Недопустимые типы ключей:
Эти типы не поддерживают операцию сравнения ==
(кроме сравнения с nil
), поэтому их нельзя использовать в качестве ключей:
- Слайсы (
[]T
) - Функции
- Мапы (
map[K]V
) - Структуры или массивы, содержащие несравнимые поля/элементы (например, структуру с полем-слайсом).
Пример:
// OK: string - сравнимый тип
m := make(map[string]int)
// Ошибка компиляции: слайс не является сравнимым типом
// invalid map key type []byte
m2 := make(map[[]byte]int)
type MyStruct struct {
ID int // Сравнимое поле
}
// OK: структура со сравнимыми полями
m3 := make(map[MyStruct]string)