💡 Инструкция: Выберите один ответ из пяти. На 30 вопросов отведено 85 минут. В каждом вопросе верен только один вариант. После завершения вы увидите общий результат и результаты по 6 тематическим шкалам с объяснениями и практическими рекомендациями.
Вопрос 2 из 30
В разделе «HTTP-запрос» показан конкретный случай. Какой вариант исправления соответствует обычной практике Go?
Go HTTP-запрос: фрагмент на ревью Копировать
// Фрагмент из ревью: требуется выбрать безопасную правку.
package main
import("context";"net/http")
func main(){ ctx,cancel:=context.WithCancel(context.Background()); req,_:=http.NewRequestWithContext(ctx,http.MethodGet,"https://example.com",nil); cancel(); _,_=http.DefaultClient.Do(req) }
Разделять аутентификацию и авторизацию, сравнивать секреты безопасным способом и ограничивать время проверки.
Проверять ошибки до записи тела, устанавливать заголовки заранее и возвращаться после отправки ошибки.
Создавать запрос с контекстом, проверять ошибку `Do`, статус и ограниченно читать тело, затем закрывать его.
Сохранять статус, длительность, метод и нормализованный маршрут, не записывая секретные заголовки и полное тело.
Зафиксировать порядок в одной функции сборки и тестами проверять отказ на каждом этапе.
Вопрос 3 из 30
Команда проверяет решение по теме «HTTP-запрос». Какой принцип языка объясняет результат полностью?
Go HTTP-запрос: проверка контракта Копировать
// Определите правило Go, которое объясняет результат.
package main
import("context";"net/http")
func main(){ ctx,cancel:=context.WithCancel(context.Background()); req,_:=http.NewRequestWithContext(ctx,http.MethodGet,"https://example.com",nil); cancel(); _,_=http.DefaultClient.Do(req) }
`http.Handler` получает `ResponseWriter` и `Request`; заголовок статуса следует записать до тела.
Middleware принимает следующий `http.Handler` и возвращает новый, выполняя работу до и после `next.ServeHTTP`.
Журнал запроса должен содержать структурированные поля и итоговый статус; для этого ResponseWriter оборачивают, сохраняя вызов `WriteHeader`.
Маршрут должен однозначно связывать метод, путь и параметры; проверка метода остаётся частью контракта обработчика.
`http.NewRequestWithContext` связывает запрос с отменой; тело должно быть закрыто после успешного `Do`, даже при неожиданном статусе.
Вопрос 22 из 30
Фрагмент относится к теме «Тестирование и наблюдаемость». Какой вариант исправления соответствует обычной практике Go?
Go Тестирование и наблюдаемость: фрагмент на ревью Копировать
// Фрагмент из ревью: требуется выбрать безопасную правку.
package sample
import("io";"net/http";"strings";"testing")
type roundTrip func(*http.Request)(*http.Response,error)
func(f roundTrip)RoundTrip(r *http.Request)(*http.Response,error){return f(r)}
func TestClient(t *testing.T){ c:=&http.Client{Transport:roundTrip(func(*http.Request)(*http.Response,error){return &http.Response{StatusCode:200,Body:io.NopCloser(strings.NewReader("ok")),Header:make(http.Header)},nil})}; resp,err:=c.Get("http://x"); if err!=nil||resp.StatusCode!=200{t.Fatal(err)};resp.Body.Close() }
Использовать `iotest` и собственные маленькие заглушки, измерять число байтов и длительность без записи содержимого секретных потоков.
Записывать метод, хост, статус, длительность и категорию ошибки, не превращая URL с идентификаторами в метки высокой кардинальности.
Проверять заголовки, контекст, статус, паники и дополнительные интерфейсы ResponseWriter.
Инъецировать часы или длительности в код с большим числом временных сценариев, чтобы тесты не зависели от реального ожидания.
Собирать статистику `db.Stats()`, время ожидания пула и длительность запросов без записи значений параметров-секретов.
Вопрос 23 из 30
На ревью разбирают тему «Тестирование и наблюдаемость». Какой принцип языка объясняет результат полностью?
Go Тестирование и наблюдаемость: проверка контракта Копировать
// Определите правило Go, которое объясняет результат.
package sample
import("io";"net/http";"strings";"testing")
type roundTrip func(*http.Request)(*http.Response,error)
func(f roundTrip)RoundTrip(r *http.Request)(*http.Response,error){return f(r)}
func TestClient(t *testing.T){ c:=&http.Client{Transport:roundTrip(func(*http.Request)(*http.Response,error){return &http.Response{StatusCode:200,Body:io.NopCloser(strings.NewReader("ok")),Header:make(http.Header)},nil})}; resp,err:=c.Get("http://x"); if err!=nil||resp.StatusCode!=200{t.Fatal(err)};resp.Body.Close() }
Протокол канала тестируют на обычном пути, закрытии, отмене и отсутствии потребителя; зависание ограничивают таймаутом теста.
Клиент тестируют через `httptest.Server` и подменный `RoundTripper`, проверяя статусы, тело, отмену и число попыток.
Отмену тестируют ожиданием `Done` и проверкой `context.Cause` или `Err`, а в метриках различают таймаут и ручную отмену.
Публичный пакет проверяют как внутренними тестами, так и внешним пакетом `_test`, примерами и тестами совместимости ошибок.
Панику проверяют в той же горутине через отложенный `recover`, а в рабочем сервисе фиксируют значение и стек.
Вопрос 27 из 30
На ревью разбирают тему «Конкурентность и эксплуатация». Какую правку разумнее внести до объединения изменений?
Go Конкурентность и эксплуатация: фрагмент на ревью Копировать
// Фрагмент из ревью: требуется выбрать безопасную правку.
package main
var slots=make(chan struct{},20)
func call(fn func()){ slots<-struct{}{}; defer func(){<-slots}(); fn() }
func main(){}
Ограничивать параллелизм, задавать контекст, отслеживать WaitCount/WaitDuration и избегать запросов N+1.
Настроить таймауты чтения заголовков, лимит тела, максимальную конкуренцию и защиту общего состояния.
Сочетать лимит параллелизма, отмену, предохранитель от серии ошибок и метрики насыщения пула.
Назначать уникальные порты через прослушивание `:0`, не менять глобальное окружение параллельно и закрывать серверы через Cleanup.
Связать лимиты HTTP, пула базы и внешних клиентов; следить за горутинами, памятью, паузами GC и очередями.