Хеш с ключом в качестве типа массива

Как создать ключ как массив в 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.

Другие вопросы по тегам