💡 Инструкция: Выберите один ответ из пяти. На 30 вопросов отведено 85 минут. В каждом вопросе верен только один вариант. После завершения вы увидите общий результат и результаты по 6 тематическим шкалам с объяснениями и практическими рекомендациями.
Вопрос 2 из 30
На ревью разбирают тему «Детектор гонок -race». Как исправить основной риск без ненужной перестройки решения?
Bash Детектор гонок -race: фрагмент на ревью Копировать
go test -race ./...
# Задача: выбрать безопасную правку или способ проверки.
Выполнять `Add` до запуска работ и передавать указатель на `WaitGroup`, не копируя его.
Выбрать политику: ждать, отклонять, сбрасывать, сохранять на диск или замедлять источник, и измерять очередь.
Передавать результаты через канал, синхронизацию или общий объект с защитой, а ошибки делать частью явного протокола.
Запускать все реалистичные тесты и сценарии под `-race`, сохранять полный отчёт и исправлять первичный общий доступ.
Передавать контекст вниз и не запускать после ответа работу, которая должна пережить запрос, без отдельного владельца.
Вопрос 12 из 30
Команда проверяет решение по теме «Блокировки». Как изменить решение, не ломая его исходную задачу?
Go Блокировки: фрагмент на ревью Копировать
// Фрагмент из ревью: требуется выбрать безопасную правку.
package main
import "sync"
type Ledger struct{mu sync.Mutex;a,b int}
func(l *Ledger)Move(n int){l.mu.Lock();defer l.mu.Unlock();if l.a>=n{l.a-=n;l.b+=n}}
func main(){}
Выражать требуемый порядок каналом, мьютексом, `WaitGroup` или другим явным отношением синхронизации.
Выбрать политику: ждать, отклонять, сбрасывать, сохранять на диск или замедлять источник, и измерять очередь.
Передавать контекст вниз и не запускать после ответа работу, которая должна пережить запрос, без отдельного владельца.
Сформулировать инвариант, выбрать владельца состояния и закрепить порядок мьютексов по идентификатору.
Использовать каналы, мьютексы, атомики или другие документированные примитивы вместо надежды на планирование.
Вопрос 16 из 30
Команда проверяет решение по теме «Исправление». Как точнее всего описать выполнение фрагмента?
Go Исправление: результат выполнения Копировать
// Фрагмент для трассировки.
package main
func main(){done:=make(chan struct{},3);for _,v:=range []int{1,2,3}{v:=v;go func(){_=v;done<-struct{}{}}()};<-done;<-done;<-done }
Запись `x=7` происходит до отправки, а получение из канала происходит до чтения `x`, поэтому читается 7.
Код печатает `busy`, потому что никто не готов принять значение из небуферизованного канала.
Каждая горутина получает собственное значение `v`, поэтому не читает одну меняющуюся переменную цикла.
Код может напечатать `A B` или `B A`; язык не обещает, какая горутина первой получит процессор.
Каждое значение получает один из работников, а порядок результатов не обязан совпадать с входом.
Вопрос 17 из 30
Перед публикацией кода по теме «Исправление» нужно уточнить контракт. Какая доработка делает поведение явным для вызывающего кода?
Go Исправление: фрагмент на ревью Копировать
// Фрагмент из ревью: требуется выбрать безопасную правку.
package main
func main(){done:=make(chan struct{},3);for _,v:=range []int{1,2,3}{v:=v;go func(){_=v;done<-struct{}{}}()};<-done;<-done;<-done }
Вызывать `Add` до запуска горутины, а `Done` ставить через `defer` в самом начале задачи.
Предпочитать передачу аргумента в замыкание и владение данными одной горутиной, где это упрощает протокол.
Передавать результаты через канал, синхронизацию или общий объект с защитой, а ошибки делать частью явного протокола.
Назначить единственного владельца закрытия и учитывать отмену при каждой отправке.
Передавать контекст вниз и не запускать после ответа работу, которая должна пережить запрос, без отдельного владельца.
Вопрос 23 из 30
Фрагмент относится к теме «Тестирование и наблюдаемость» в тесте «Race detector и диагностика конкурентности». Какой принцип позволяет вывести ответ без запуска программы?
Bash Тестирование и наблюдаемость: проверка контракта Копировать
go test -race -count=50 -run TestConcurrentInvariant ./...
# Требуется объяснить правило, а не только назвать команду.
Перед выпуском нужны модульные, интеграционные и нагрузочные проверки критических путей, а после — контролируемое наблюдение новых ошибок и задержки.
Слой данных тестируют на ошибках начала, запроса, сканирования и коммита; отдельно нужен интеграционный тест реальной базы.
После исправления нужны тест инварианта, повтор под `-race` и наблюдение симптома, по которому дефект был найден.
Детектор гонок находит только гонки, проявившиеся в выполненных путях, поэтому нужны разнообразная нагрузка и повторение.
Потоковый код тестируют читателями, которые дробят данные, возвращают ошибки после байтов и выполняют короткие записи.