Какие подводные камни при итерировании по map в Go?
Answer from AI
sobes.tech AI
При итерировании по map в Go есть несколько важных особенностей и подводных камней:
-
Порядок обхода не определён и может меняться — каждый раз при итерации по map порядок ключей может быть разным. Нельзя полагаться на фиксированный порядок.
-
Изменение map во время итерации — если во время обхода добавлять или удалять элементы, поведение не определено и может привести к панике или пропуску элементов.
-
Копирование ключей и значений — при итерации переменные ключа и значения переопределяются, поэтому если сохранять их адреса, можно получить неожиданные результаты.
Пример неправильного сохранения адресов ключей:
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 во время обхода и аккуратно работать с переменными цикла.