💡 Инструкция: Выберите один ответ из пяти. На 30 вопросов отведено 85 минут. В каждом вопросе верен только один вариант. После завершения вы увидите общий результат и результаты по 6 тематическим шкалам с объяснениями и практическими рекомендациями.
Вопрос 12 из 30
Перед публикацией кода по теме «Транзакции» нужно уточнить контракт. Какой вариант исправления соответствует обычной практике Go?
Go Транзакции: фрагмент на ревью Копировать
// Фрагмент из ревью: требуется выбрать безопасную правку.
package main
import("context";"database/sql")
func run(ctx context.Context,db *sql.DB)error{tx,err:=db.BeginTx(ctx,nil);if err!=nil{return err};defer tx.Rollback();if _,err=tx.ExecContext(ctx,"UPDATE t SET n=n+1");err!=nil{return err};return tx.Commit()}
func main(){}
Проверять заголовки, контекст, статус, паники и дополнительные интерфейсы ResponseWriter.
Параметризовать все значения, а динамические имена столбцов выбирать только из закрытого белого списка.
Ставить `defer rows.Close()` сразу после успешного `QueryContext` и проверять ошибку итерации.
Открывать пул при старте, проверять `PingContext`, задавать MaxOpen/Idle и время жизни соединений по возможностям базы.
Начинать транзакцию с контекстом, проверять каждую ошибку, коммитить только после полного успеха.
Вопрос 23 из 30
На ревью разбирают тему «Тестирование и наблюдаемость». Какое утверждение точнее всего описывает действующую гарантию?
Go Тестирование и наблюдаемость: проверка контракта Копировать
// Определите правило Go, которое объясняет результат.
package sample
// Псевдокод ожиданий: Begin -> Exec OK -> Exec error -> Rollback.
func main(){}
Обобщённый алгоритм тестируют представителями разных ветвей ограничения и именованными типами, а не только `int`.
Потоковый код тестируют читателями, которые дробят данные, возвращают ошибки после байтов и выполняют короткие записи.
Слой данных тестируют на ошибках начала, запроса, сканирования и коммита; отдельно нужен интеграционный тест реальной базы.
Протокол канала тестируют на обычном пути, закрытии, отмене и отсутствии потребителя; зависание ограничивают таймаутом теста.
Конвейер тестируют на пустом входе, ранней отмене, медленном потребителе и закрытии всех выходов; отдельно считают активные работники.
Вопрос 27 из 30
На ревью разбирают тему «Конкурентность и эксплуатация». Как подготовить этот код к реальному использованию?
Go Конкурентность и эксплуатация: фрагмент на ревью Копировать
// Фрагмент из ревью: требуется выбрать безопасную правку.
package main
import "database/sql"
func stats(db *sql.DB)(int,int64){s:=db.Stats();return s.InUse,s.WaitCount}
func main(){}
Сочетать лимит параллелизма, отмену, предохранитель от серии ошибок и метрики насыщения пула.
Иметь общий корневой контекст, идемпотентное закрытие, ограниченный льготный срок и принудительный финальный путь.
Ограничивать кардинальность меток, контролировать очередь лимитера и не удерживать глобальную блокировку во время `next`.
Ограничивать параллелизм, задавать контекст, отслеживать WaitCount/WaitDuration и избегать запросов N+1.
Назначать уникальные порты через прослушивание `:0`, не менять глобальное окружение параллельно и закрывать серверы через Cleanup.