💡 Инструкция: Выберите один ответ из пяти. На 20 вопросов отведено 55 минут. В каждом вопросе верен только один вариант. После завершения вы увидите общий результат и результаты по 4 тематическим шкалам с объяснениями и практическими рекомендациями.
Вопрос 6 из 20
На ревью разбирают тему «Проверка наличия». Как точнее всего описать выполнение фрагмента?
Go Проверка наличия: результат выполнения Копировать
// Фрагмент для трассировки.
package main
func main() {
m := map[string]int{"x":0}
vx, okx := m["x"]
vy, oky := m["y"]
_, _, _, _ = vx, okx, vy, oky
}
GET можно повторить после временной сетевой ошибки, а POST без ключа идемпотентности может создать дубль.
Для `"aя"` индексы будут `0` и `1`, а следующая позиция после второй руны — 3 байта.
Функция `Has` принимает ключ любого сравнимого типа, согласованного с ключами карты.
Для карты `{"x":0}` чтение ключа `x` вернёт `0, true`, а ключа `y` — `0, false`.
Для `s := a[1:3]` при массиве длины 4 значения равны `len(s)==2` и `cap(s)==3`.
Вопрос 7 из 20
В разделе «Проверка наличия» показан конкретный случай. Какая доработка делает поведение явным для вызывающего кода?
Go Проверка наличия: фрагмент на ревью Копировать
// Фрагмент из ревью: требуется выбрать безопасную правку.
package main
func main() {
m := map[string]int{"x":0}
vx, okx := m["x"]
vy, oky := m["y"]
_, _, _, _ = vx, okx, vy, oky
}
Использовать полное выражение среза `a[low:high:max]`, когда нужно ограничить ёмкость и предотвратить запись через `append` в соседние данные.
Использовать индекс из `range` как байтовое смещение, а не как порядковый номер символа.
Хранить примеры компилируемыми, тестировать нулевое значение и конкурентный контракт, если они обещаны.
Использовать собственный неэкспортируемый тип ключа и небольшие неизменяемые значения.
Использовать форму с `ok`, если ноль является допустимым сохранённым значением.
Вопрос 8 из 20
Команда проверяет решение по теме «Проверка наличия». Какое правило достаточно применить для проверки ответа?
Go Проверка наличия: проверка контракта Копировать
// Определите правило Go, которое объясняет результат.
package main
func main() {
m := map[string]int{"x":0}
vx, okx := m["x"]
vy, oky := m["y"]
_, _, _, _ = vx, okx, vy, oky
}
Двухзначное чтение `v, ok := m[k]` отличает отсутствующий ключ от присутствующего ключа с нулевым значением.
`range` по строке выдаёт байтовый индекс начала руны и саму руну; индекс может увеличиваться больше чем на единицу.
Неинициализированная переменная получает нулевое значение своего типа; это не означает, что такое значение подходит предметной области.
Каждый middleware тестируют отдельно и в реальном порядке цепочки, включая отсутствие вызова `next`.
`len` — доступная длина среза, `cap` — сколько элементов можно охватить от начала среза до конца базового массива.