Back to questions
Senior
5
Что выведет этот код, и почему? ```go package main import "fmt" func main() { lst := []string{"a", "b", "c", "d"} for k, v := range lst { if k == 0 { lst = []string{"aa", "bb", "cc", "dd"} } fmt.Println(v) } } ```
Companies where asked
Озон банк
Answer from AI
sobes.tech AI
Код выведет:
a
b
c
d
Почему:
В Go, когда вы используете for k, v := range lst, срез lst копируется по ссылке, но итератор работает по исходному срезу, который был на момент начала цикла. Изменение переменной lst внутри цикла не влияет на итерацию.
То есть, при входе в цикл lst содержит {"a", "b", "c", "d"}, и именно по этому срезу происходит итерация. Переприсвоение lst внутри цикла не меняет набор элементов, по которым идёт обход.
Если бы вы хотели, чтобы изменения среза влияли на цикл, нужно было бы использовать другой подход, например, цикл с индексами или перезапускать цикл.
Пример:
for i := 0; i < len(lst); i++ {
if i == 0 {
lst = []string{"aa", "bb", "cc", "dd"}
}
fmt.Println(lst[i])
}
В этом случае вывод будет другим, и может привести к панике, если длина изменится.