Что выведет код Senior Слайсы и мапы изнутри обновлено

Что выведет Go: range по массиву и по слайсу

Вопрос

Что выведет программа? Go 1.23, в go.mod указано go 1.23. Каждую строку вывода пишите с новой строки.

package main

import "fmt"

func main() {
    arr := [3]int{1, 2, 3}
    for i, v := range arr {
        if i == 0 {
            arr[1] = 20
        }
        fmt.Print(v, " ")
    }
    fmt.Println()
    sl := []int{1, 2, 3}
    for i, v := range sl {
        if i == 0 {
            sl[1] = 20
        }
        fmt.Print(v, " ")
    }
    fmt.Println()
}

Попробуйте сами

Напишите, что выведет код: каждый вывод с новой строки.

Показать ответ и разбор

Коротко

Код выведет: 1 2 3, 1 20 3. Выражение range вычисляется один раз.

Что выведет

1 2 3
1 20 3

Разбор

Выражение range вычисляется один раз. Для массива это копия всего массива, поэтому изменение arr[1] в цикле не видно: печатается 2. Для слайса копируется только заголовок, массив общий, и на второй итерации читается уже 20.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.