Ответ
В Go ключом для map
может быть любой сравниваемый (comparable) тип данных. Тип является сравниваемым, если для его значений определена операция сравнения на равенство (==
) и неравенство (!=
).
Допустимые типы ключей:
- Числовые типы:
int
,float64
,complex128
и все их вариации. - Строки:
string
. - Булевы значения:
bool
. - Указатели:
*T
. Сравниваются адреса, на которые они указывают. - Каналы:
chan T
. Сравниваются адреса в памяти. - Интерфейсы:
interface{}
. Сравниваются, если их динамические значения сравнимы. - Структуры (
struct
), если все их поля являются сравниваемыми типами. - Массивы (
[N]T
), если тип их элементовT
является сравниваемым.
Запрещенные типы ключей:
Эти типы не поддерживают операцию сравнения ==
, поэтому не могут быть ключами:
- Слайсы (
[]T
) - Карты (
map[K]V
) - Функции (
func()
)
Пример:
// Корректные примеры
var m1 map[string]int
var m2 map[int]bool
type MyStruct struct {
ID int
Name string
}
var m3 map[MyStruct]float64 // OK, т.к. все поля структуры сравнимы
// Ошибка компиляции
var m4 map[[]int]string // Ошибка: invalid map key type []int