Sobes.tech
Back to questions
Senior
4

Какие подводные камни при итерировании по map в Go?

Companies where asked
FinFrame

Answer from AI

sobes.tech AI

При итерировании по map в Go есть несколько важных особенностей и подводных камней:

  1. Порядок обхода не определён и может меняться — каждый раз при итерации по map порядок ключей может быть разным. Нельзя полагаться на фиксированный порядок.

  2. Изменение map во время итерации — если во время обхода добавлять или удалять элементы, поведение не определено и может привести к панике или пропуску элементов.

  3. Копирование ключей и значений — при итерации переменные ключа и значения переопределяются, поэтому если сохранять их адреса, можно получить неожиданные результаты.

Пример неправильного сохранения адресов ключей:

m := map[string]int{"a":1, "b":2}
var keys []*string
for k := range m {
    keys = append(keys, &k) // все элементы будут указывать на одну переменную k
}

Правильно нужно создавать копию внутри цикла:

for k := range m {
    keyCopy := k
    keys = append(keys, &keyCopy)
}

Итого, при работе с map важно помнить про неопределённый порядок, не менять map во время обхода и аккуратно работать с переменными цикла.