Ответ
Да, структура может быть ключом в 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}]) // Выведет: "Точка А"
}
Важный нюанс: Если структура содержит поля-указатели, сравниваться будут адреса в памяти, а не значения, на которые они указывают. Это может привести к неожиданному поведению.