Что выведет код 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 ошибок.
Предыдущий вопрос
Что выведет Go: atomic.Int64 из 100 горутин
Следующий вопрос
Код-ревью Go: кеш на RWMutex
Ещё по теме «sync и атомики»
- Глобальный максимум через CompareAndSwap
- Конкурентные переводы между счетами без дедлока
- Шардированная мапа с мьютексом на шард
- Код-ревью Go: ленивый синглтон и горячая перезагрузка конфига
- Типизированные атомики
- Атомики или мьютекс
- CompareAndSwap
- Флаг без синхронизации