Самый простой и гибкий способ - использовать struct
в качестве типа ключа, включая все данные, которые вы хотите включить в ключ, поэтому в вашем случае:
type Key struct {
X, Y int
}
И это все. Используя это:
m := map[Key]int{}
m[Key{2, 2}] = 4
m[Key{2, 3}] = 8
fmt.Println("2^2 = ", m[Key{2, 2}])
fmt.Println("2^3 = ", m[Key{2, 3}])
Вывод (попробуйте на Go Playground ):
2^2 = 4
2^3 = 8
Spec: Типы карт: Вы можете использовать любые типы в качестве ключа, когда операторы сравнения ==
и !=
полностью определены, и вышеприведенный Key
тип структуры выполняет это.
Spec: Операторы сравнения: Значения структур сравнимы, если все их поля сравнимы. Два структурных значения равны, если их соответствующие не пустые поля равны.
Одна важная вещь: вы не должны использовать указатель в качестве типа ключа (например, *Key
), потому что сравнение указателей сравнивает только адрес памяти, а не указанные значения.
Также обратите внимание, что вы также можете использовать массивы (не слайсы ) в качестве типа ключа, но массивы не так гибки, как структуры. Подробнее об этом можно прочитать здесь: Почему в Go есть массивы?
Вот как это будет выглядеть с массивами:
type Key [2]int
m := map[Key]int{}
m[Key{2, 2}] = 4
m[Key{2, 3}] = 8
fmt.Println("2^2 = ", m[Key{2, 2}])
fmt.Println("2^3 = ", m[Key{2, 3}])
Вывод такой же. Попробуйте на Go Playground .