💡 Инструкция: Выберите один ответ из пяти. На 25 вопросов отведено 70 минут. В каждом вопросе верен только один вариант. После завершения вы увидите общий результат и результаты по 5 тематическим шкалам с объяснениями и практическими рекомендациями.
Вопрос 13 из 25
На ревью разбирают тему «Закрытие». Что именно гарантирует Go в этой ситуации?
Go Закрытие: проверка контракта Копировать
// Определите правило Go, которое объясняет результат.
package main
func main(){ ch:=make(chan int,2); ch<-1; ch<-2; close(ch); for range ch{} }
Хорошая ошибка сообщает, какая операция и над каким объектом не удалась, но не дублирует слово `error` на каждом уровне.
Закрытие сообщает, что новых значений больше не будет; обычно канал закрывает отправитель, который знает о завершении всех отправок.
Контекст запроса отменяется при разрыве клиента, отмене HTTP/2 или завершении обработчика; дочерняя работа должна его уважать.
Каждый этап должен прекращать чтение и отправку при отмене, иначе ранний выход потребителя оставляет заблокированные горутины.
Горутина, навсегда заблокированная на отправке, чтении или ожидании, остаётся жить и удерживать связанные данные.
Вопрос 17 из 25
На ревью разбирают тему «Направленные каналы». Как изменить решение, не ломая его исходную задачу?
Go Направленные каналы: фрагмент на ревью Копировать
// Фрагмент из ревью: требуется выбрать безопасную правку.
package main
func produce(out chan<- int){ out<-1 }
func main(){ ch:=make(chan int,1); produce(ch); _=<-ch }
Всегда вызывать возвращённую `cancel`, даже если операция завершилась раньше, чтобы освободить связанные ресурсы.
Сужать направление в сигнатурах, чтобы контракт функции и ошибки использования проверялись компилятором.
Для повторного использования аккуратно останавливать и сбрасывать `Timer`, учитывая возможное уже доставленное значение.
Передавать результаты через канал, синхронизацию или общий объект с защитой, а ошибки делать частью явного протокола.
Использовать каналы, мьютексы, атомики или другие документированные примитивы вместо надежды на планирование.
Вопрос 23 из 25
Команда проверяет решение по теме «Тестирование и наблюдаемость». Какое правило достаточно применить для проверки ответа?
Go Тестирование и наблюдаемость: проверка контракта Копировать
// Определите правило Go, которое объясняет результат.
package sample
import "testing"
func TestClosed(t *testing.T){ ch:=make(chan int); close(ch); v,ok:=<-ch; if v!=0||ok{t.Fatal(v,ok)} }
Обобщённый алгоритм тестируют представителями разных ветвей ограничения и именованными типами, а не только `int`.
Слой данных тестируют на ошибках начала, запроса, сканирования и коммита; отдельно нужен интеграционный тест реальной базы.
Клиент тестируют через `httptest.Server` и подменный `RoundTripper`, проверяя статусы, тело, отмену и число попыток.
Протокол канала тестируют на обычном пути, закрытии, отмене и отсутствии потребителя; зависание ограничивают таймаутом теста.
Потоковый код тестируют читателями, которые дробят данные, возвращают ошибки после байтов и выполняют короткие записи.