Основы синтаксиса

21 вопросов

Фундамент языка Go: типы данных, переменные, константы, операторы и zero values. Эти знания необходимы для написания любой программы на Go и часто встречаются на собеседованиях.

1 Какой zero value у типа string? 🟢 Лёгкий
Ответ: B) ""

Каждый тип в Go имеет zero value - значение по умолчанию при объявлении переменной без инициализации. Для string это пустая строка "", не nil (строка - не указатель).

Подробнее →
2 Какой результат: fmt.Println(1 + "1")? 🟢 Лёгкий
Ответ: C) Ошибка компиляции

Go - строго типизированный язык. Нельзя складывать int и string без явного приведения типов. В отличие от JavaScript или Python, Go не выполняет неявных преобразований.

Подробнее →
3 Как объявить константу в Go? 🟢 Лёгкий
Ответ: B) const x = 5

Константы объявляются ключевым словом const. В Go нет let (это JavaScript), define (это C/препроцессор). var объявляет переменную, а не константу.

Подробнее →
4 Какой zero value у типа bool? 🟢 Лёгкий
Ответ: B) false

Zero value для bool - false. Для числовых типов - 0, для строк - "", для указателей - nil.

Подробнее →
5 Какой zero value у типа int? 🟢 Лёгкий
Ответ: C) 0

Числовые типы (int, float64, uint и т.д.) имеют zero value равный 0. Не nil (это для указателей, каналов, слайсов, map, интерфейсов).

Подробнее →
6 Какой zero value у указателя *int? 🟢 Лёгкий
Ответ: B) nil

Указатели, слайсы, map, каналы, интерфейсы и функции имеют zero value равный nil. Указатель *int - не сам int, а ссылка на него, поэтому по умолчанию он nil, а не 0.

Подробнее →
7 Что такое short variable declaration? 🟢 Лёгкий
Ответ: B) x := 5

Оператор := - короткое объявление переменной. Go автоматически определяет тип по правой части. Можно использовать только внутри функций, не на уровне пакета.

Подробнее →
8 Можно ли использовать := на уровне пакета? 🟢 Лёгкий
Ответ: B) Нет

Оператор := работает только внутри функций. На уровне пакета используется var x = 5 или var x int = 5. Это ограничение синтаксиса Go.

Подробнее →
9 Что выведет fmt.Println(true && false)? 🟢 Лёгкий
Ответ: B) false

Оператор && - логическое И. Результат true только когда оба операнда true. true && false = false. Go выводит булевы значения как true/false, не как 1/0.

Подробнее →
10 Какой тип у литерала 3.14 без явного указания? 🟢 Лёгкий
Ответ: B) float64

Go использует float64 как тип по умолчанию для дробных литералов. Если нужен float32, его надо указать явно: var x float32 = 3.14. Типов double и decimal в Go нет.

Подробнее →
11 Что такое blank identifier в Go? 🟢 Лёгкий
Ответ: A) _

Blank identifier _ используется, чтобы игнорировать значение. Например: _, err := someFunc() - первое возвращаемое значение игнорируется. Go не позволяет объявлять неиспользуемые переменные, поэтому _ необходим.

Подробнее →
12 Какой максимальный размер типа uint8? 🟢 Лёгкий
Ответ: B) 255

uint8 - беззнаковое 8-битное целое. Диапазон: 0–255 (2⁸ − 1). Тип int8 (знаковый) имеет диапазон −128–127. byte - это алиас для uint8.

Подробнее →
13 Что вернёт min(3, 1, 4, 1, 5) (Go 1.21+)? 🟢 Лёгкий
Ответ: B) 1

С Go 1.21 min и max - встроенные функции, принимающие переменное число аргументов любого упорядоченного типа. min(3, 1, 4, 1, 5) = 1. Работают с int, float64, string. Больше не нужна math.Min для целых чисел.

Подробнее →
14 Зачем используется import _ "github.com/lib/pq"? 🟢 Лёгкий
Ответ: B) Выполняет init() пакета для регистрации драйвера БД

Blank import (_) выполняет init() пакета без доступа к его именам. Драйверы БД регистрируют себя в init() через sql.Register. Без blank import Go не скомпилирует код с неиспользуемым импортом. Это стандартный способ подключения драйверов database/sql.

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

Функция len() для строк возвращает количество байт, а не символов. Строки в Go - последовательности байт в UTF-8. Каждая кириллическая буква - 2 байта, поэтому "Привет" (6 букв) = 12 байт.

Подробнее →
16 Какой результат: fmt.Println(010)? 🟡 Средний
Ответ: B) 8

Литерал 010 - это восьмеричное число (префикс 0). В восьмеричной системе 10 = 1×8 + 0 = 8 в десятичной. Аналогично: 0x10 = 16 (шестнадцатеричное), 0b10 = 2 (двоичное).

Подробнее →
17 Какой результат: x := 5; x, y := 10, 20; fmt.Println(x, y)? 🟡 Средний
Ответ: B) 10 20

Во второй строке := допустим, потому что y - новая переменная. При этом x просто переприсваивается (не создаётся заново). Правило: в := хотя бы одна переменная должна быть новой.

Подробнее →
18 Что выведет: x := 1; if true { x := 2; _ = x }; fmt.Println(x)? 🟡 Средний
Ответ: A) 1

Оператор := внутри блока if создаёт новую переменную x, которая затеняет (shadow) внешнюю. Внешняя x остаётся равной 1. Это частая ошибка при обработке ошибок - вместо := нужно использовать = для присваивания существующей переменной.

Подробнее →
19 Что делает ключевое слово fallthrough в switch? 🟡 Средний
Ответ: A) Переходит к следующему case без проверки условия

В Go, в отличие от C, switch не проваливается автоматически - после выполнения case он завершается. fallthrough принудительно переходит к следующему case без проверки его условия. Используется редко, но иногда нужно для последовательной обработки.

Подробнее →
20 Сколько функций init() может быть в одном Go-файле? 🟡 Средний
Ответ: B) Несколько - все вызываются при инициализации пакета

В одном файле может быть несколько init(). Все вызываются автоматически при инициализации пакета, в порядке появления в файле. init() нельзя вызвать явно. Порядок между файлами - алфавитный. init() вызывается после инициализации глобальных переменных пакета.

Подробнее →
21 Скомпилируется ли: const x = 1 << 100; fmt.Println(x)? 🔴 Сложный
Ответ: D) Нет, ошибка при вызове Println

Нетипизированные константы в Go имеют произвольную точность - объявление const x = 1 << 100 корректно. Но при передаче в fmt.Println() Go пытается привести x к типу int по умолчанию. Значение не помещается в int64, и компилятор выдаёт ошибку overflow.

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