среда, 27 мая 2020 г.

Переменная итерации не видит изменений в range цикле

Почему переменная итерации x не замечает, что a[1] обновлено?

var a [2]int
for _, x := range a {
    fmt.Println("x =", x)
    a[1] = 8
}
fmt.Println("a =", a)

x = 0
x = 0        <- Почему здесь не 8?
a = [0 8]

Ответ

Выражение range a вычисляется один раз перед началом цикла, а копия массива используется для генерации значений итерации.

Чтобы избежать копирования массива, итерируйте срез.

var a [2]int
for _, x := range a[:] {
    fmt.Println("x =", x)
    a[1] = 8
}
fmt.Println("a =", a)

x = 0
x = 8
a = [0 8]


Читайте также:


Комментариев нет:

Отправить комментарий