Может ли структура быть ключом в `map` и какие есть ограничения?

Ответ

Да, структура может быть ключом в map, но только если она является сравниваемой (comparable).

Структура считается сравниваемой, если все её поля также являются сравниваемыми типами. К ним относятся:

  • Числовые типы (int, float64 и т.д.)
  • Строки (string)
  • Булевы значения (bool)
  • Указатели
  • Каналы
  • Массивы, элементы которых сравниваемы
  • Другие структуры, состоящие из сравниваемых полей

Ограничение: Структура не может быть ключом, если содержит несравниваемые типы, такие как:

  • Слайсы (slice)
  • Карты (map)
  • Функции (func)

При попытке использовать такую структуру в качестве ключа возникнет ошибка компиляции.

package main

import "fmt"

type Point struct {
    X, Y int
}

func main() {
    // Эта структура является сравниваемой
    m := make(map[Point]string)
    p1 := Point{1, 2}
    m[p1] = "Точка А"

    fmt.Println(m[Point{1, 2}]) // Выведет: "Точка А"
}

Важный нюанс: Если структура содержит поля-указатели, сравниваться будут адреса в памяти, а не значения, на которые они указывают. Это может привести к неожиданному поведению.