TGViewer
Go tests Go tests @golangtests · 7.82K subscribers
Post #768 2.87K
🔍 Вопрос: что выведет этот код?

package main

import (
"fmt"
)

func main() {
m := map[string]int{"a": 1, "b": 2}
keys := make([]string, 0, len(m))

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

for i := range keys {
delete(m, keys[i])
m["z"] = i
}

fmt.Println("map:", m)
fmt.Println("keys:", keys)
}

---
✅ Ответ: Вывод программы будет зависеть от порядка итерации по ключам в исходной мапе m.

В Go порядок итерации по элементам map не гарантируется и может меняться от запуска к запуску.
Рассмотрим возможные варианты развития событий, предполагая два наиболее вероятных порядка итерации:

Сценарий 1: Порядок итерации - "a", "b"
Итерация 1:
k становится "a".
keys становится ["a"].
Удаляется элемент с ключом "a" из m. m теперь {"b": 2}.
Добавляется элемент {"z": 0} в m. m теперь {"b": 2, "z": 0}.
Итерация 2:
k становится "b".
keys становится ["a", "b"].
Удаляется элемент с ключом "b" из m. m теперь {"z": 0}.
Добавляется элемент {"z": 1} в m (перезаписывая предыдущее значение). m теперь {"z": 1}.
В этом случае вывод будет:
map: map["z":1]
keys: [a b]
Сценарий 2: Порядок итерации - "b", "a"

Итерация 1:
k становится "b".
keys становится ["b"].
Удаляется элемент с ключом "b" из m. m теперь {"a": 1}.
Добавляется элемент {"z": 0} в m. m теперь {"a": 1, "z": 0}.

Итерация 2:
k становится "a".
keys становится ["b", "a"].
Удаляется элемент с ключом "a" из m. m теперь {"z": 0}.
Добавляется элемент {"z": 1} в m (перезаписывая предыдущее значение). m теперь {"z": 1}.
В этом случае вывод будет:
map: map["z":1]
keys: [b a]

Итог:
Гарантируется, что:
Значение в мапе m после выполнения цикла всегда будет map["z":1]. Это происходит потому, что в каждой итерации старое значение ключа "z" перезаписывается.

Слайс keys будет содержать ключи исходной мапы в том порядке, в котором они были получены при первой итерации. Это может быть ["a", "b"] или ["b", "a"], или какой-либо другой порядок, если мапа была больше.

Поэтому возможные варианты вывода:
Вариант 1:
map: map["z":1]
keys: [a b]
Вариант 2:
map: map["z":1]
keys: [b a]
Какой именно вариант вы увидите при запуске, предсказать невозможно из-за недетерминированного порядка итерации по map в Go.
  • 👍 9
  • 👎 4
  • ❤ 2
  • 🔥 1
More from @golangtests
  1. Sep 26, 2026Nil-интерфейс в Go: почему err == nil выдаёт false? Nil-интерфейс в Go ломает даже опытных…
  2. Sep 23, 2026Задача по Go: `select` и побочные эффекты Что выведет программа? package main import "fmt"…
  3. Sep 23, 2026Не застревайте в прошлом — учитесь новым навыкам и ИИ Чтобы успевать за требованиями рынка…
  4. Sep 13, 2026👣 Задача на Go 1.27: concurrent job scheduler с generic methods Нужно реализовать библиот…
  5. Sep 13, 2026🔥 Хочешь расти в IT быстрее остальных? Перестань учиться в одиночку Можно годами смотреть…
  6. Sep 2, 2026👣 Go 1.27: почему две разные closure внезапно могут иметь одинаковый адрес функции? Что в…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →