Какие типы данных могут использоваться в качестве ключа в `map` в Go?

Ответ

В 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