Основы синтаксиса Строки и руны Массивы и слайсы Map Структуры и методы Интерфейсы Горутины и конкурентность Каналы defer, panic, recover Обработка ошибок Указатели Пакет sync Тестирование Пакеты и модули Стандартная библиотека Context Generics iota и перечисления Разное / продвинутое

Разное / продвинутое

25 вопросов

Продвинутые темы Go: go vet, go fmt, go:embed, сборщик мусора, рефлексия, unsafe.Pointer, variadic функции, замыкания и другие особенности языка.

1 Что делает go vet? 🟡 Средний
Ответ: B) Находит подозрительные конструкции в коде

go vet - статический анализатор. Находит ошибки, которые компилятор пропускает: неправильные аргументы Printf, копирование мьютексов, недостижимый код, ошибки в тегах структур.

Подробнее →
2 Что делает go fmt? 🟢 Лёгкий
Ответ: B) Форматирует код по стандартам Go

go fmt (или gofmt) автоматически форматирует код: отступы табами, расстановка скобок, выравнивание. Единый стиль для всех Go-проектов.

Подробнее →
3 Что такое //go:embed? 🟡 Средний
Ответ: B) Директива для встраивания файлов в бинарник

//go:embed (Go 1.16+) встраивает содержимое файлов в переменные при компиляции. Можно встроить строку, []byte или embed.FS. Удобно для шаблонов, статики, конфигов.

Подробнее →
4 Какой сборщик мусора используется в Go? 🟡 Средний
Ответ: B) Concurrent mark-and-sweep

Go использует конкурентный трёхцветный mark-and-sweep GC. Он работает параллельно с программой, обеспечивая паузы < 1 мс. Не generational (как в Java).

Подробнее →
5 Что делает runtime.NumGoroutine()? 🟡 Средний
Ответ: B) Возвращает текущее число горутин

runtime.NumGoroutine() возвращает количество активных горутин. Полезно для мониторинга и обнаружения утечек горутин. Если число постоянно растёт - у вас утечка.

Подробнее →
6 Что такое reflect пакет? 🟡 Средний
Ответ: B) Позволяет исследовать типы и значения во время выполнения

reflect - рефлексия: можно узнать тип переменной, её поля, вызывать методы динамически. Используется в encoding/json, ORM. Медленнее прямого доступа - используйте только когда необходимо.

Подробнее →
7 В чём разница между make и new? 🟡 Средний
Ответ: B) make - для slice/map/chan, new - возвращает указатель

make(T, args) - создаёт и инициализирует slice, map или chan (возвращает сам тип). new(T) - выделяет память и возвращает *T с zero value. Разные задачи.

Подробнее →
8 Что такое stringer interface? 🟡 Средний
Ответ: B) Тип с методом String() string

Интерфейс fmt.Stringer содержит метод String() string. Типы, реализующие его, автоматически используются fmt.Println для красивого вывода. Аналог toString() в Java.

Подробнее →
9 Какая функция запускается первой в Go-программе? 🟡 Средний
Ответ: C) init() затем main()

Порядок: 1) инициализация зависимых пакетов (их init()), 2) init() пакета main, 3) main(). Все init() завершаются до начала main().

Подробнее →
10 Можно ли в Go вернуть несколько значений из функции? 🟢 Лёгкий
Ответ: B) Да

Go поддерживает множественные возвращаемые значения: func div(a, b int) (int, error). Это основа обработки ошибок в Go. Можно использовать именованные возвращаемые значения.

Подробнее →
11 Что такое variadic function? 🟡 Средний
Ответ: B) Функция с переменным числом аргументов (func f(a ...int))

...T в параметре означает, что функция принимает 0+ аргументов типа T. Внутри функции это слайс []T. Примеры: fmt.Println(a ...any), append(s []T, elems ...T). Должен быть последним параметром.

Подробнее →
12 Что выведет: defer fmt.Println("a"); defer fmt.Println("b")? 🟡 Средний
Ответ: B) b a

Defer'ы выполняются в порядке LIFO (стек). Сначала зарегистрирован "a", затем "b". При выходе сначала выполняется последний ("b"), потом первый ("a").

Подробнее →
13 Как передать слайс в variadic-функцию? 🟡 Средний
Ответ: B) f(slice...)

Оператор ... после слайса «разворачивает» его в отдельные аргументы. f([]int{1,2,3}...) эквивалентно f(1, 2, 3). Без ... весь слайс будет одним аргументом - ошибка типов.

Подробнее →
14 Что такое замыкание (closure)? 🟡 Средний
Ответ: B) Функция, захватывающая переменные из внешней области

Замыкание - анонимная функция, которая «замыкает» (захватывает) переменные из окружающей области видимости. Переменные разделяются по ссылке, а не копируются. Частая ловушка: замыкание в цикле.

Подробнее →
15 Что делает go generate? 🟡 Средний
Ответ: B) Запускает команды из комментариев //go:generate

go generate ищет комментарии //go:generate command в исходниках и выполняет указанные команды. Используется для кодогенерации: stringer, mockgen, protobuf. Не запускается автоматически при go build.

Подробнее →
16 Что такое unsafe.Pointer? 🔴 Сложный
Ответ: B) Указатель, обходящий систему типов

unsafe.Pointer - универсальный указатель, который можно привести к любому типу указателя. Обходит проверки типов. Используется для низкоуровневых оптимизаций. Нарушает гарантии безопасности Go.

Подробнее →
17 Что выведет: s := "hello"; fmt.Println(s[0])? 🟡 Средний
Ответ: B) 104 (код байта)

Индексация строки возвращает byte, не символ. s[0] - байт с кодом 104 (ASCII-код 'h'). fmt.Println выводит числовое значение байта. Для символа: string(s[0]) или fmt.Printf("%c", s[0]).

Подробнее →
18 Как преобразовать []byte в string? 🟢 Лёгкий
Ответ: B) string(b)

string(b) - преобразование []byte в string. Создаёт копию данных (строки иммутабельны). Обратно: []byte(s). Эти преобразования - O(n) по памяти из-за копирования.

Подробнее →
19 Что произойдёт при panic(nil)? 🔴 Сложный
Ответ: B) Программа завершится с panic

panic(nil) вызывает панику. Начиная с Go 1.21, panic(nil) оборачивается в *runtime.PanicNilError, чтобы recover() мог отличить «не было паники» от «panic(nil)».

Подробнее →
20 Что такое sync.Map? 🟡 Средний
Ответ: B) Потокобезопасная map

sync.Map - конкурентно-безопасная map, не требующая внешней блокировки. Оптимизирована для случаев, когда ключи стабильны (много чтений, мало записей).

Подробнее →
21 Для чего нужен sync.Pool? 🔴 Сложный
Ответ: B) Пул переиспользуемых объектов для снижения нагрузки на GC

sync.Pool кеширует аллоцированные объекты для повторного использования. Снижает давление на GC. Объекты могут быть удалены GC в любой момент - не для постоянного хранения.

Подробнее →
22 Что такое go:build тег? 🟡 Средний
Ответ: B) Условие компиляции файла

//go:build linux - директива условной компиляции. Файл будет включён только при сборке для Linux. Можно комбинировать: //go:build linux && amd64. Заменил старый формат // +build.

Подробнее →
23 Что вернёт fmt.Sprintf("%T", 42)? 🟡 Средний
Ответ: B) "int"

Глагол %T выводит тип значения. 42 - нетипизированная константа, по умолчанию int. %T полезен для отладки. Работает с любыми типами, включая кастомные.

Подробнее →
24 Какой пакет для атомарных операций? 🟡 Средний
Ответ: B) sync/atomic

sync/atomic предоставляет атомарные операции: AddInt64, LoadInt64, StoreInt64, CompareAndSwapInt64. Работают без мьютексов, на уровне процессорных инструкций. Быстрее мьютексов для простых счётчиков.

Подробнее →
25 Что такое method set типа? 🟡 Средний
Ответ: B) Набор методов, определённых для типа

Method set определяет, какие интерфейсы тип реализует. У значения T - только value receiver методы. У указателя *T - и value, и pointer receiver методы. Поэтому *T может реализовать интерфейс, который T не реализует.

Подробнее →