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

Ответ

Ключом в 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)