Стандартная библиотека

22 вопросов

Богатая стандартная библиотека Go: net/http для веб-серверов, encoding/json для JSON, fmt для форматирования, io для потоков, time для работы с временем.

1 Какой пакет используется для HTTP-сервера? 🟢 Лёгкий
Ответ: B) net/http

net/http - мощный пакет для HTTP-клиента и сервера. http.ListenAndServe(":8080", handler) запускает сервер. Многие Go-фреймворки (gin, chi, echo) построены поверх net/http.

Подробнее →
2 Какой пакет используется для работы с JSON? 🟢 Лёгкий
Ответ: B) encoding/json

encoding/json - пакет для сериализации (Marshal) и десериализации (Unmarshal) JSON. Работает через рефлексию и теги структур (json:"name").

Подробнее →
3 Что делает json.Marshal(v)? 🟢 Лёгкий
Ответ: B) Сериализует значение в JSON ([]byte)

json.Marshal принимает любое значение и возвращает ([]byte, error) - JSON-представление. Экспортированные поля структур попадают в JSON, приватные - нет.

Подробнее →
4 Какой пакет используется для форматированного вывода? 🟢 Лёгкий
Ответ: B) fmt

fmt - форматированный ввод/вывод. Println, Printf, Sprintf, Fprintf. Поддерживает глаголы: %v (значение), %T (тип), %d (число), %s (строка).

Подробнее →
5 Какой пакет для работы с временем? 🟢 Лёгкий
Ответ: B) time

Пакет time предоставляет Time, Duration, Timer, Ticker. time.Now(), time.Since(), time.Sleep(). Формат даты: t.Format("2006-01-02") - Go использует эталонную дату.

Подробнее →
6 Какой пакет для структурированного логирования добавлен в Go 1.21? 🟢 Лёгкий
Ответ: B) log/slog

log/slog - стандартный пакет для структурированного логирования. slog.Info("запрос", "method", "GET", "path", "/api") выводит ключ-значение пары. Поддерживает JSON и текстовый формат, уровни логирования. Заменяет сторонние логгеры (zap, zerolog) для большинства задач.

Подробнее →
7 Зачем создавать свой http.Client вместо использования http.DefaultClient? 🟢 Лёгкий
Ответ: B) DefaultClient не имеет таймаутов - запрос может висеть бесконечно; свой клиент позволяет настроить Timeout и Transport

http.DefaultClient не имеет Timeout. В production зависший сервер заблокирует горутину навсегда. Всегда создавайте клиент с Timeout.

Подробнее →
8 Почему формат в time.Parse и time.Format использует конкретную дату "Mon Jan 2 15:04:05 MST 2006"? 🟢 Лёгкий
Ответ: B) Каждый компонент имеет уникальное числовое значение (1, 2, 3, 4, 5, 6, 7) для однозначного распознавания формата

Reference time: месяц=1 (January), день=2, час=15 (3 PM), минута=04, секунда=05, год=2006, смещение=-0700. Каждое число уникально, поэтому Go точно понимает что есть что.

Подробнее →
9 Чем time.Ticker отличается от time.Timer? 🟢 Лёгкий
Ответ: B) Ticker срабатывает периодически через равные интервалы, Timer - однократно после заданной задержки

time.NewTicker(d) отправляет в канал каждые d. time.NewTimer(d) отправляет один раз через d. Оба нужно останавливать через Stop().

Подробнее →
10 Какой интерфейс нужно реализовать для сортировки кастомного типа через sort.Sort? 🟢 Лёгкий
Ответ: A) sort.Interface с методами Len() int, Less(i, j int) bool, Swap(i, j int)

sort.Interface требует три метода: Len (длина коллекции), Less (сравнение двух элементов по индексам), Swap (обмен двух элементов). sort.Sort(data) сортирует in-place.

Подробнее →
11 Как в Go преобразовать строку в число и обратно? 🟢 Лёгкий
Ответ: A) Пакет strconv: Atoi (string -> int), Itoa (int -> string), ParseFloat, FormatFloat для других типов

strconv.Atoi("42") -> 42, err. strconv.Itoa(42) -> "42". ParseInt/ParseFloat для других оснований и типов. Приведение int("42") не компилируется.

Подробнее →
12 Что делает io.Copy(dst, src)? 🟡 Средний
Ответ: B) Копирует данные из Reader в Writer

io.Copy читает из io.Reader и пишет в io.Writer, пока не встретит io.EOF или ошибку. Работает с любыми потоками: файлы, сеть, буферы.

Подробнее →
13 Как задать таймаут для HTTP-клиента? 🟡 Средний
Ответ: D) Оба B и C подходят

http.Client{Timeout: 5*time.Second} - таймаут на весь запрос. context.WithTimeout - более гибкий, можно задать для отдельных запросов. На практике используют оба подхода.

Подробнее →
14 Чем log.Fatal("error") отличается от panic("error")? 🟡 Средний
Ответ: B) log.Fatal вызывает os.Exit - deferred функции не выполняются

log.Fatal пишет сообщение в лог и вызывает os.Exit(1) - deferred функции не выполняются, recover не поможет. panic запускает раскрутку стека, deferred функции выполняются, и panic можно перехватить через recover. log.Fatal - для фатальных ошибок при старте.

Подробнее →
15 Что делает http.HandleFunc("GET /users/{id}", handler) в Go 1.22+? 🟡 Средний
Ответ: B) Обрабатывает только GET-запросы с path-параметром id

Go 1.22 добавил HTTP-метод и path-параметры в стандартный ServeMux. "GET /users/{id}" обрабатывает только GET. Параметр доступен через r.PathValue("id"). Раньше для этого нужны были внешние роутеры (chi, gorilla).

Подробнее →
16 Чем отличается JSON-сериализация var s []int от s := []int{}? 🟡 Средний
Ответ: B) nil-слайс даёт null, пустой слайс - []

json.Marshal(nil-слайса) возвращает null, а json.Marshal(пустого слайса) - []. Критично для API: фронтенд обрабатывает null и [] по-разному. Для гарантии [] инициализируйте слайс: s := []int{} или s := make([]int, 0).

Подробнее →
17 Какой паттерн используется для HTTP middleware в Go? 🟡 Средний
Ответ: B) func(http.Handler) http.Handler

Middleware в Go - функция, принимающая http.Handler и возвращающая http.Handler. Пример: func Log(next http.Handler) http.Handler { return http.HandlerFunc(func(w, r) { log(r); next.ServeHTTP(w, r) }) }. Middleware оборачивают друг друга: Log(Auth(handler)).

Подробнее →
18 Чем slices.SortFunc (Go 1.21+) лучше sort.Slice? 🟡 Средний
Ответ: B) Типобезопасна благодаря generics, нет интерфейсных вызовов

slices.SortFunc использует generics - нет приведения типов и интерфейсных вызовов. sort.Slice работает через interface{} и рефлексию. slices.SortFunc инлайнит функцию сравнения. slices.SortStableFunc - для стабильной сортировки.

Подробнее →
19 Что произойдет, если не вызвать resp.Body.Close() после успешного HTTP-запроса? 🟡 Средний
Ответ: B) Утечка TCP-соединения: оно не вернется в пул, и при многих запросах соединения исчерпаются

http.Client переиспользует TCP-соединения (keep-alive). Если Body не прочитан и не закрыт, соединение не возвращается в пул.

Подробнее →
20 Как http.Client переиспользует TCP-соединения? 🟡 Средний
Ответ: B) Через встроенный Transport с пулом keep-alive соединений; по умолчанию MaxIdleConnsPerHost=2

http.DefaultTransport поддерживает пул keep-alive соединений. MaxIdleConnsPerHost=2 по умолчанию - при нагрузке на один хост стоит увеличить.

Подробнее →
21 Зачем существует strings.Clone(s) (Go 1.20+), если строки неизменяемы? 🔴 Сложный
Ответ: B) Чтобы освободить большой массив, на который ссылается подстрока

Подстрока s[i:j] может ссылаться на большой базовый массив оригинальной строки, не давая GC его собрать. strings.Clone создаёт копию с новым массивом. Это важно при чтении маленьких подстрок из больших данных (парсинг файлов, HTTP-заголовки).

Подробнее →
22 Почему time.After может вызвать утечку памяти в цикле с select? 🔴 Сложный
Ответ: B) Каждый вызов создает новый Timer, который не освобождается до срабатывания; в цикле накапливаются тысячи незавершенных таймеров

time.After(d) создает Timer при каждом вызове. В цикле select каждая итерация создает новый Timer, который живет до истечения d. При высокой частоте это тысячи таймеров в памяти.

Подробнее →
🧠Квиз 🏆Лидеры 🎯Собесед. 📖Вопросы 📚База зн.