💡 Инструкция: Выберите один ответ из пяти. На 25 вопросов отведено 70 минут. В каждом вопросе верен только один вариант. После завершения вы увидите общий результат и результаты по 5 тематическим шкалам с объяснениями и практическими рекомендациями.
Вопрос 2 из 25
На ревью разбирают тему «Предельный срок». Как изменить решение, не ломая его исходную задачу?
Go Предельный срок: фрагмент на ревью Копировать
// Фрагмент из ревью: требуется выбрать безопасную правку.
package main
import("context";"time")
func main(){ p,cancel:=context.WithTimeout(context.Background(),10*time.Millisecond); defer cancel(); c,stop:=context.WithTimeout(p,time.Second); defer stop(); <-c.Done() }
Передавать результаты через канал, синхронизацию или общий объект с защитой, а ошибки делать частью явного протокола.
Выбирать размер буфера по измеренному всплеску и скорости потребителя, а не использовать большое число как лечение зависания.
Выполнять `Add` до запуска работ и передавать указатель на `WaitGroup`, не копируя его.
Выбирать срок на границе запроса и передавать его вниз, а не создавать независимые длинные таймауты в каждом слое.
Создавать объект локально, завершать инициализацию и только затем публиковать через канал, мьютекс, `Once` или атомарный указатель.
Вопрос 22 из 25
В рабочем примере по теме «Тестирование и наблюдаемость» важно отделить гарантию от догадки. Как изменить решение, не ломая его исходную задачу?
Go Тестирование и наблюдаемость: фрагмент на ревью Копировать
// Фрагмент из ревью: требуется выбрать безопасную правку.
package sample
import("context";"testing";"time")
func TestDeadline(t *testing.T){ ctx,cancel:=context.WithTimeout(context.Background(),time.Millisecond); defer cancel(); <-ctx.Done(); if ctx.Err()!=context.DeadlineExceeded{t.Fatal(ctx.Err())} }
Хранить примеры компилируемыми, тестировать нулевое значение и конкурентный контракт, если они обещаны.
Запускать `-shuffle`, `-count`, `-race`, хранить медленные интеграционные тесты отдельно и анализировать пропуски покрытия по риску.
Использовать короткий контролируемый таймаут, синхронизацию запуска и отдельную проверку причины завершения.
Запускать серии на стабильной машине, фиксировать входы и отдельно следить за p50/p95/p99, CPU, GC и очередями.
Использовать барьеры вместо сна, запускать `-race` и отслеживать число горутин до и после серии операций.
Вопрос 23 из 25
Фрагмент относится к теме «Тестирование и наблюдаемость». Какое утверждение остаётся верным на всех поддерживаемых платформах?
Go Тестирование и наблюдаемость: проверка контракта Копировать
// Определите правило Go, которое объясняет результат.
package sample
import("context";"testing";"time")
func TestDeadline(t *testing.T){ ctx,cancel:=context.WithTimeout(context.Background(),time.Millisecond); defer cancel(); <-ctx.Done(); if ctx.Err()!=context.DeadlineExceeded{t.Fatal(ctx.Err())} }
Конвейер тестируют на пустом входе, ранней отмене, медленном потребителе и закрытии всех выходов; отдельно считают активные работники.
Отмену тестируют ожиданием `Done` и проверкой `context.Cause` или `Err`, а в метриках различают таймаут и ручную отмену.
Клиент тестируют через `httptest.Server` и подменный `RoundTripper`, проверяя статусы, тело, отмену и число попыток.
Таймаут в тесте должен ограничивать зависание, а не заменять причинную синхронизацию и не доказывать порядок планирования.
Слой данных тестируют на ошибках начала, запроса, сканирования и коммита; отдельно нужен интеграционный тест реальной базы.