Библиотека Go для собеса | вопросы с собеседований
6.79K subscribers
216 photos
5 videos
1 file
365 links
Вопросы с собеседований по Go и ответы на них.

По рекламе: @proglib_adv

Учиться у нас: https://proglib.io/w/0b524a15

Для обратной связи: @proglibrary_feeedback_bot

Наши каналы: https://t.me/proglibrary/9197
Download Telegram
Что такое Zero value в Go

Zero value это дефолтное состояние переменных. Например, когда вы создаете переменную структуры, все её поля будут автоматически инициализированы своими нулевыми значениями.

В Go переменные всегда инициализируются нулевыми значениями при их создании. Это позволяет безопасно работать с ними, не беспокоясь о возможных неинициализированных значениях.

Значение зависит от типа переменной:
числовые типы (int, float64) — 0
булевые типы — false
для строк — пустая строка ""
указатели, функции, интерфейсы, срезы, карты и каналы — nil
массивы и структуры — нулевые значения соответствующих типов

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
В чем разница между массивами и срезами

Массив — это структура данных с фиксированным размером, определенным при создании. Размер массива нельзя изменить.
Как его создать: [capacity]data_type{element_values}

Срез — это динамическая версия массива с переменной длиной, которая дает большую гибкость.
Как его создать: s := []data_type{element1, element2, ...}

Особенности срезов:

• Для получения длины используйте len(), для емкостиcap().
• Для добавления элементов append().
Разделение массивов через [first_index:second_index] или s[:].
• Удаление элементов append(s[:i], s[i+1:]...).
Многомерные срезы содержат в качестве элементов другие срезы, в скобках отмечаются родительские срезы.
Копирование с помощью copy().

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
Какую роль играют пакеты в Go и почему они важны

В Go пакет — это основная единица организации кода. Он представляет собой набор файлов в одной директории с общим именем, указанным в строке package в начале каждого файла.

Пакеты позволяют структурировать программу, разделяя её на логические компоненты.

Особенности в пакетах:


• Объявление пакета — каждый файл начинается с директивы package <имя>

• Импорт пакетов — используем директиву import для доступа к функциям и типам из других пакетов

• Структура каталогов — пакет соответствует одной директории. Все файлы пакета должны быть в одной папке

• Экспортируемые элементы пишутся с заглавной буквы экспортируются и доступны в других пакетах, с маленькой — локальны
Пример:

var Pi = 3.14  // экспортируемая
var radius = 5 // неэкспортируемая


• Программы должны
содержать пакет main и функцию main()

Пакеты стандартной библиотеки fmt и math/rand

• Сторонние пакеты — устанавливаются через go get и импортируются по полному пути

• Модули в Go 1.11+ модули управляют зависимостями пакетов через файл go.mod

• Тесты размещаются в файлах с суффиксом _test.go в том же пакете

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
Что такое тип map в Go

В языке Go map представляет собой встроенный тип данных, реализующий структуру данных "хеш-таблица".
Он позволяет хранить и эффективно извлекать пары ключ-значение, где каждый ключ уникален и связан с определённым значением.

• Создание map
1. Использование функции make:
m := make(map[string]int)
m["a"] = 1
m["b"] = 2

2. Использование литерала карты:
m := map[string]int{
"a": 1,
"b": 2,
}


• Работа с элементами карты
Добавление или обновление значения: m["c"] = 3
Получение значения:
value := m["a"]
Проверка наличия ключа:
value, exists := m["b"]
Удаление элемента:
delete(m, "a")

• Потокобезопасность
Карты в Go не потокобезопасны. Для безопасного доступа из нескольких горутин используйте мьютексы (sync.Mutex) или sync.Map
var mu sync.Mutex
mu.Lock()
m["a"] = 1
mu.Unlock()


🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
Какую ошибку можно ожидать при преобразовании интерфейса к несовместимому типу

Если попытаться преобразовать интерфейс к несовместимому типу без проверки, то это приведет к панике.

Когда тип данных в интерфейсе не совпадает с ожидаемым типом, программа вызовет ошибку типа:
panic: interface conversion: <interface type> is <actual type>, not <expected type>


Программа завершит выполнение с ошибкой, и никаких дальнейших операций не будет выполнено. Чтобы избежать этого, рекомендуется всегда использовать проверку типа с ok, чтобы обработать несовпадения типов безопасным способом.

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
Как в Go организовано управление памятью

В Go управление памятью полностью автоматизировано благодаря сборщику мусора. Это значит, что вам не нужно вручную выделять и освобождать память, как в C или C++.
Однако важно быть внимательным, особенно при работе с большими структурами данных, чтобы избежать утечек памяти.

Основные моменты:

• Сборщик мусора:
Алгоритм маркировки и освобождения автоматически помечает активные объекты, а затем очищает неактивные, освобождая память.

• Указатели:
В Go можно работать с указателями, но память выделяется при создании объектов и автоматически освобождается. Прямого управления выделением и освобождением через указатели нет.

• Циклические ссылки:
Хотя управление памятью автоматическое, неправильное использование, например, циклические ссылки, может привести к утечкам. Важно следить за ресурсами.

• Срезы:
Это динамические массивы, которые автоматически управляют памятью при изменении их размера.

• Стек и куча:
Память делится на стек (для локальных переменных) и кучу (для долгоживущих объектов). Управление памятью в куче осуществляется сборщиком мусора.

• Escape analysis:
Этот механизм анализирует, должен ли объект находиться на стеке или в куче, что позволяет Go более эффективно управлять памятью.

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
Как реализованы интерфейсы и как их используют в коде

Интерфейсы — это инструмент для задания поведения объектов. Они позволяют работать с разными типами, обеспечивая гибкость и полиморфизм.

➡️ Определение интерфейса
Интерфейс в Go — это набор методов
без реализации.
type Writer interface {
Write([]byte) (int, error)
}


➡️ Реализация интерфейса
Тип
реализует интерфейс, если он предоставляет все методы интерфейса. В Go нет необходимости явно указывать реализацию — это происходит неявно.

➡️ Пустой интерфейс
Интерфейс без методов называется пустым (
interface{}). Любой тип удовлетворяет этому интерфейсу, что позволяет создавать универсальные функции и структуры.

➡️ Встраивание интерфейсов
Можно комбинировать интерфейсы, например:

type ReadWriter interface {
Reader
Writer
}


➡️ Методы с указателями
Если метод имеет указатель в качестве получателя, он может быть частью интерфейса
только если используется указатель на тип.

➡️ Использование интерфейсов
Интерфейсы задают требования к поведению типов, что позволяет функциям
работать с различными типами через интерфейс.

➡️ Type assertion и type switch
Для приведения типов и проверки типа значения интерфейса используют операции
type assertion и type switch.

➡️ Значение интерфейса
Интерфейс состоит из двух частей: указателя на значение и указателя на таблицу методов этого значения.


➡️ Nil интерфейса
Интерфейс может содержать значение
nil. При вызове метода на таком интерфейсе возникнет ошибка.

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
🏎 Вы уже сталкивались с «глухими» зависаниями и гонками данных в Go? Настало время взять каналы под контроль!

💻 На открытом уроке «Подводные камни каналов в Go — и как их обходить» 1 июля в 20:00 МСК мы не просто обсудим, что такое каналы:

— покажем реальные кейсы;
— узнаем, где без них не обойтись;
— разберём частые ошибки, которые тормозят ваши сервисы.

🚀 Представьте: ваш сервис обрабатывает запросы параллельно, без блокировок и утечек. Вы глубоко понимаете, как каналы помогают строить конкурентный код и уверенно внедряете это на любом проекте.

👉 Регистрируйтесь сейчас и получите персональную скидку на курс «Golang Developer. Professional»: https://clc.to/0fYV1g

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Какую роль играет ключевое слово defer в Go

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

Применения defer:

Закрытие ресурсов. Одно из самых частых применений defer — это гарантированное закрытие ресурсов (например, файлов, сетевых соединений или подключений к базе данных) после их использования.
file, err := os.Open("file.txt")
if err != nil {
// обработка ошибки
}
defer file.Close()


Множественные отложенные вызовы. Вы можете использовать несколько defer в одной функции. Они будут выполняться в обратном порядке (LIFO — Last In, First Out).
func example() {
defer fmt.Println("1")
defer fmt.Println("2")
fmt.Println("Function body")
}


Передача аргументов. Аргументы функции, вызванной через defer, вычисляются в момент вызова defer, а не при фактическом исполнении отложенной функции.
func example(a int) {
defer fmt.Println(a)
a *= 2
return
}
example(5) // Выведет: 5


Использование с паникой. defer часто используется с recover() для обработки или логирования паники, если она возникает в функции.
func mightPanic() {
defer func() {
if r := recover(); r != nil {
fmt.Println("Recovered from panic:", r)
}
}()
// код, который может вызвать панику
}


Зависимость от контекста. Отложенные функции могут иметь доступ к локальным переменным и изменять их значения, что делает defer удобным инструментом для выполнения завершающих операций перед выходом из функции.

Затраты на производительность. Хотя defer очень удобно использовать, в циклах с интенсивными вычислениями его применение может незначительно повлиять на производительность из-за накладных расходов.

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
🤯 Мы больше года строим мультиагентные системы

Грабли, находки, паттерны, эксперименты — всё это накопилось и в какой-то момент стало жалко держать только у себя.

Никита — рассказывает (и показывает) базу: токенизация, LLM, SFT, PEFT, локальный инференс + RAG и как оценивать его качество.
Диана — как строят мультиагентные системы, какие есть паттерны проектирования и библиотеки.
Макс — про инференс в проде + разберет CoPilot, соберет с вами из кусочков свой копайлот, а затем его сломает через prompt injection. // Макс фанат autogen (а если нет — он вас разубедит в своем классном канале)
Финальным аккордом Дима углубится в MCP и соберет несколько кейсов повзрослее.

Курс тут: https://clc.to/47pgYA
Промокод: datarascals действует до 23:59 29 июня
Какую роль выполняют функции make и new в Go, и чем они отличаются

В Go, несмотря на наличие сборщика мусора, разработчикам всё равно необходимо выделять память для новых переменных. Для этого язык предоставляет две встроенные функции: new и make.

➡️ Функция new(T) выделяет память для переменной типа T, инициализирует её нулевым значением этого типа и возвращает указатель на эту переменную.
p := new(int)

В этом примере p будет указателем на новый int, инициализированный значением 0.

➡️ Функция make используется для инициализации срезов, карт и каналов, которые являются встроенными типами данных в Go и требуют дополнительной инициализации перед использованием.

• Срезы: при создании среза с помощью
make, задаются начальная длина и ёмкость, что позволяет Go заранее выделить нужное количество памяти
s := make([]int, 5, 10) 

Map: при создании map с помощью make осуществляется его инициализация перед добавлением элементов
m := make(map[string]int)

• Каналы:
make также используется для создания каналов.
ch := make(chan int)


Основные различия между
make и new

➡️ new возвращает указатель на тип, инициализированный нулевым значением этого типа.
➡️ make возвращает инициализированный экземпляр встроенного типа (среза, map или канала), готовый к использованию.
➡️ Обычно, для выделения памяти под переменные используют литералы типа или make. new используется реже и в основном в более специфичных случаях.

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM