Что выведет код Middle sync и атомики обновлено

Что выведет Go: sync.Once и OnceValue

Вопрос

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

package main

import (
    "fmt"
    "sync"
)

func main() {
    calls := 0
    get := sync.OnceValue(func() int {
        calls++
        return 42
    })
    var once sync.Once
    for range 3 {
        once.Do(func() { calls += 10 })
        _ = get()
    }
    fmt.Println(get(), calls)
}

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

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

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

Коротко

Код выведет: 42 11. OnceValue вызывает функцию один раз и запоминает результат: calls + 1. once.Do выполняет свою функцию тоже один раз: calls + 10.

Что выведет

42 11

Разбор

OnceValue вызывает функцию один раз и запоминает результат: calls + 1. once.Do выполняет свою функцию тоже один раз: calls + 10. Остальные вызовы ничего не делают. Итого 11.

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

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