Golang gen Flashcards

(32 cards)

1
Q
  1. Что такое Go и чем он отличается от других языков программирования?
A

Go — компилируемый, статически типизированный язык от Google. Отличается простотой синтаксиса, встроенной конкурентностью (goroutines, каналы), быстрой компиляцией в один статический бинарник, автоматической сборкой мусора и богатым стандартным пакетом. В отличие от Java/C#, нет наследования классов и исключений; вместо этого — композиция, интерфейсы по неявной реализации и ошибка как значение.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q
  1. Какие преимущества и недостатки у Go?
A

Плюсы: простота, скорость компиляции, кроссплатформенные статические бинарники, встроенная конкурентность, стабильный ABI на уровне пакета, богатый stdlib, инструменты из коробки (fmt, vet, test). Минусы: ограниченная дженерик-система (появились в Go 1.18, но без метапрограммирования), нет исключений, ограниченные возможности наследования, простая система управления пакетами (модули) без сложных workspaces до недавнего времени.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q
  1. Как устроена система типов в Go?
A

Статическая, сильная типизация. Есть базовые типы (числа, bool, string), составные (array, slice, map, struct, function, channel, pointer, interface). Пользовательские типы объявляются через type. Есть дженерики (параметризованные типы/функции), типовые ограничения (constraints) и интерфейсы с неявной реализацией.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q
  1. Что такое zero values в Go?
A

Значения по умолчанию для переменных при инициализации: 0 для чисел, false для bool, “” для string, nil для ссылочных типов (slice, map, pointer, channel, function, interface). Zero value всегда корректен к использованию, но некоторые операции требуют явной инициализации (например, make для map/channel/slice).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q
  1. Как работают указатели в Go?
A

Указатель хранит адрес значения (*T). Оператор & берёт адрес, * разыменовывает. Нельзя выполнять арифметику указателей. Метод с receiver-ом *T может изменять состояние, а с T — работает с копией.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q
  1. Чем отличаются var, := и const?
A

var — объявление с возможной инициализацией, доступно в любом блоке и на уровне пакета. := — короткое объявление и инициализация только внутри функции. const — постоянные на этапе компиляции для чисел, строк, bool; могут быть типизированные или нетипизированные.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q
  1. Какие существуют типы данных в Go?
A

Числовые (int, uint, размеры, float32/64, complex64/128), логический bool, строка string, указатели, массивы, срезы, карты (map), структуры (struct), функции, интерфейсы, каналы, дженерик-параметры.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q
  1. Чем rune отличается от byte?
A

byte — псевдоним для uint8, хранит один байт. rune — псевдоним для int32, хранит один Unicode кодпоинт. Строка — это неизменяемая последовательность байтов UTF-8, а не rune-ов.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q
  1. Что такое slices и чем они отличаются от arrays?
A

Array — фиксированная длина, часть типа ([3]int). Slice — дескриптор (указатель, длина, ёмкость), указывает на подмассив и динамически растёт через append. Срез — ссылочный тип; копирование среза копирует дескриптор, а не данные.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q
  1. Как работает функция append()?
A

Добавляет элементы в срез. Если хватает capacity — записывает в тот же underlying array; если нет — аллоцирует новый массив (обычно рост ≈×2), копирует данные и возвращает новый срез. Всегда использовать возвращаемое значение: s = append(s, x).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q
  1. Что такое map и как он устроен внутри?
A

map[K]V — хеш-таблица. Внутри — массив бакетов, в бакете хранятся несколько пар ключ-значение и метки хеша. При росте — рехеширование (инкрементальное). Нулевое значение nil непригодно для записи: требуется make(map[K]V) или литерал.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q
  1. Как проверить, существует ли ключ в map?
A

Через «comma ok» идиому: v, ok := m[k]. Если ok == true, ключ существует; иначе v — zero value типа V.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q
  1. Чем отличаются nil и пустая строка/массив/срез?
A

nil применим только к ссылочным типам и означает «нет значения/адреса». Пустая строка “”, пустой массив [0]T{}, пустой срез []T{} — это валидные значения. У пустого среза len=0, а cap может быть 0; nil-срез тоже имеет len=0, но nil указатель внутри.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q
  1. Как работает оператор defer?
A

Откладывает выполнение функции до выхода из текущей функции (включая панический выход). Аргументы вычисляются немедленно, вызов — позже. Полезно для закрытия ресурсов.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q
  1. Чем defer отличается от panic и recover?
A

panic инициирует «панический» выход по стеку с выполнением всех defer. recover перехватывает панику, если вызван внутри отложенной функции. defer — просто механизм отложенного вызова, не связанный с ошибками напрямую.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q
  1. В каком порядке выполняются несколько defer?
A

LIFO — последний объявленный defer выполнится первым.

17
Q
  1. Что такое пакеты (packages) и как их использовать?
A

Единица компиляции и импортов. Директория = пакет (кроме main, формирующего исполняемый файл). Экспортируемые имена начинаются с заглавной буквы. Импорт через import “path”.

18
Q
  1. Как работает импорт в Go?
A

Имя модуля + путь пакета. Управление зависимостями — через Go Modules (go mod init, go get). Можно задавать алиасы: import foo “example.com/x/y”. Пустой импорт (_ “pkg”) — для побочных эффектов (вызова init).

19
Q
  1. Что такое init() и зачем он нужен?
A

Функция пакета, выполняется до main() и после инициализации переменных. Используется для регистрации, проверки окружения, установки глобальных переменных. Может быть несколько init в одном пакете/файле.

20
Q
  1. Что такое iota?
A

Счётчик констант в блоке const, начинается с 0 и увеличивается на 1 в каждой строке. Удобен для перечислений и битовых масок.

21
Q
  1. Как устроена обработка ошибок в Go?
A

Ошибка — это значение типа error. Возвращается как последний результат: v, err := f(). Проверяется явно: if err != nil { … }. Для дополнительного контекста используют обёртки (fmt.Errorf(“…: %w”, err)) и errors.Is/As.

22
Q
  1. Чем error отличается от panic?
A

error — управляемая, ожидаемая ошибка бизнес-логики или окружения; обрабатывается и возвращается вызывающему коду. panic — критическая ситуация (инвариант нарушен), обычно не для обычного потока выполнения; приводит к падению, если не перехвачена recover.

23
Q
  1. Как работает fmt.Printf и что означают %s, %d и др.?
A

Форматированный вывод в стиле printf: %s — строка, %d — десятичное целое, %v — «как есть», %+v — с полями, %#v — Go-литерал, %T — тип, %f — float, %t — bool. Управление шириной/точностью через флаги.

24
Q
  1. Чем отличаются new и make?
A

new(T) выделяет память под T и возвращает *T, заполняя zero value. make инициализирует внутренние структуры ссылочных типов (slice, map, channel) и возвращает сам значение этого типа, готовое к использованию.

25
25. Что такое пустая структура struct{} и зачем она нужна?
Структура без полей, занимает 0 байт. Используется как «сигнальный» тип (например, в каналах для сигналов без данных), для сетов на map[T]struct{} и как плейсхолдер.
26
26. Как в Go реализуются константы?
Через const. Числовые/строковые/булевы константы могут быть нетипизированными (примут тип по месту использования). Композитные типы констант недоступны (нельзя const []int).
27
27. Что такое UTF-8 в Go и как строки хранятся в памяти?
Строка — неизменяемая последовательность байтов, обычно в UTF-8. Индексация по байтам, не по символам. Для обхода по Unicode-кодпоинтам используйте for range или преобразование в []rune.
28
28. Что такое shadowing переменных?
Объявление новой переменной с тем же именем в более вложенной области видимости скрывает внешнюю. Частая ошибка с :=, когда переменная err «затеняется» и проверяется не та. Избегайте, внимательно следя за областями видимости.
29
29. Как работает garbage collector в Go?
Современный, инкрементальный, триколорный, с низкими паузами (stop-the-world минимизирован). Освобождает объекты, на которые нет достижимых ссылок. Настройка через переменные окружения (GOGC) и профилирование.
30
30. Чем интерфейсы в Go отличаются от интерфейсов в других языках?
Реализация интерфейса — неявная: тип реализует интерфейс, если у него есть методы интерфейса. Это снижает связность и упрощает тестирование. Интерфейсы — значения с динамическим типом и значением; nil-интерфейс отличать от интерфейса с nil-значением.
31
31. Как работает go doc и go fmt?
go doc выводит документацию по пакетам/символам. go fmt (или gofmt) форматирует код по стандарту. Оба инструмента встроены, обеспечивают единый стиль и удобство изучения кода.
32
32. Чем Go отличается от C и Java?
От C: сборщик мусора, безопасные строки, простая модель конкурентности, без ручного управления памятью и без арифметики указателей. От Java: компилируется в нативный бинарник без JVM, ошибки — значения, нет исключений по умолчанию и нет классов/наследования (композиция и интерфейсы).