Pull to refresh

Comments 6

иногда хочется сделать ключом два значения, но не хочется объявлять дополнительно структуры. для этого может оказаться полезным в качестве ключа указать массив. например:

m := map[[2]any]string{}

m[[2]any{"user", 111}] = "Alice"
m[[2]any{"user", 222}] = "Bob"

println(m[[2]any{"user", 222}])

а если еще добавить в качестве мини-утилиты функцию

func key2(a, b any) [2]any {
	return [2]any{a, b}
}

то можно писать так: m[key2("user", 111)] = "Alice"

иногда бывает полезным.

а то частенько встречал код, где делают мапы мапов %)


и тут я замечаю кое-что интересное :) не думал что ключом может быть массив из any - т.к. any ведь может быть и не сравнимым типом. попробовал заменить 222 на слайс - обламывается в рантайме. т.е. он не только при компиляции проверяет что ключ валидного типа. любопытно, спасибо!

а насчет ключа из двух значений - в скриптовых языках я обычно объединяю два значения в строчку чтобы сделать ключ - например, часто когда ключом надо координату сделать:

m[x .. ":" .. y] = 100

Про порядок ключей и печать мапы - можно уточнить, пакет fmt сам сортирует мапу по ключу при формировании mapString, поэтому обычный fmt.Print(m) всегда будет печатать "отсортированную" мапу. Видел подобный вопрос на каком-то из моков, возможно кому-то пригодится)

да, спасибо, подписал под примером а то действительно выглядит неясно зачем он там :)

Добрый день! Вы так интересно описываете. Хотелось бы видеть у вас больше статей про Go.

Sign up to leave a comment.

Articles