Хеш с ключом в качестве типа массива
Как создать ключ как массив в Go для карты. Например в ruby я могу реализовать это так:
quarters = {
[1, 2, 3] => 'First quarter',
[4, 5, 6] => 'Second quarter',
[7, 8 ,9] => 'Third quarter',
[10, 11, 12] => 'Fourh quarter',
}
quarters[[1, 2, 3]]
# => "First quarter"
Как то же самое будет выглядеть на Голанге?
2 ответа
Типы массивов (в отличие от срезов) в Go сравнимы, поэтому в этом нет ничего волшебного: вы можете просто определить его как любые другие карты: map[KeyType]ValueType
где KeyType
будет [3]int
а также ValueType
будет string
,
Операторы сравнения == и!= Должны быть полностью определены для операндов типа ключа; таким образом, тип ключа не должен быть функцией, картой или срезом.
m := map[[3]int]string{}
m[[3]int{1, 2, 3}] = "First quarter"
m[[3]int{4, 5, 6}] = "Second quarter"
m[[3]int{7, 8, 9}] = "Third quarter"
m[[3]int{10, 11, 12}] = "Fourth quarter"
fmt.Println(m)
Выход:
map[[1 2 3]:First quarter [4 5 6]:Second quarter
[7 8 9]:Third quarter [10 11 12]:Fourth quarter]
Попробуйте это на игровой площадке Go.
Чтобы запросить элемент:
fmt.Println(m[[3]int{1, 2, 3}]) // Prints "First quarter"
Вы также можете создать карту за один шаг:
m := map[[3]int]string{
[3]int{1, 2, 3}: "First quarter",
[3]int{4, 5, 6}: "Second quarter",
[3]int{7, 8, 9}: "Third quarter",
[3]int{10, 11, 12}: "Fourth quarter",
}
Следует отметить, что array
в рубине и array
в ходу разные структуры данных. Go массив не изменяемый, а ruby array
является. Идти slice
намного больше похожая структура данных на ruby array
, Тем не менее, вы не можете использовать slices
как ключи в ходу, как указано в ответе icza.
Итак, чтобы ответить на ваш вопрос:
Как то же самое будет выглядеть на Голанге?
Это невозможно, вы не можете иметь словарь, который отображает dynamic arrays
в strings
в ходу. Тем не менее, вы можете преобразовать slices
в arrays
и используйте их в качестве ключей, как хорошо объяснил icza.