Что выведет код Junior Горутины и планировщик GMP спрашивают часто обновлено

Что выведет Go: замыкания в цикле в Go 1.22+

Вопрос

Что выведет программа? Go 1.23, в go.mod указано go 1.23.

package main

import "fmt"

func main() {
    var fns []func()
    for i := 0; i < 3; i++ {
        fns = append(fns, func() { fmt.Print(i, " ") })
    }
    for _, f := range fns {
        f()
    }
    fmt.Println()
}

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

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

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

Коротко

Код выведет: 0 1 2. Модуль с go 1.23 в go.mod использует семантику Go 1.22: у каждой итерации своя переменная i, и каждое замыкание запоминает своё значение.

Что выведет

0 1 2

Разбор

Модуль с go 1.23 в go.mod использует семантику Go 1.22: у каждой итерации своя переменная i, и каждое замыкание запоминает своё значение. В Go 1.21 и раньше все три замыкания делили одну переменную и напечатали бы 3 3 3.

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

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