Библиотека Go для собеса | вопросы с собеседований
6.87K subscribers
218 photos
6 videos
1 file
415 links
Вопросы с собеседований по Go и ответы на них.

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

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

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

Наши каналы: https://t.me/proglibrary/9197
Download Telegram
💬 Почему добавление элементов в nil-срез работает, а добавление в nil-мапу вызывает панику?

В Go срезы и тип map работают по-разному:

1. Срезы:
🔸 nil-срез — это валидный срез с нулевой длиной (len == 0) и нулевой ёмкостью (cap == 0).
🔸 Когда мы вызываем append() на nil-срезе, Go выделяет новую память и создаёт срез с достаточной ёмкостью для хранения новых элементов. Поэтому добавление элементов в nil-срез работает без ошибок.

Пример:
var a []int
a = append(a, 4, 5, 6) // Создаётся новый срез в памяти
fmt.Println(a) // [4 5 6]


2. Тип map
🔸 nil-мапа неинициализирована и не имеет памяти для хранения пар ключ-значение.
🔸 Любая попытка добавить элемент в nil-мапу вызовет панику, так как мапа не готова к использованию.
🔸 Для работы с мапой её нужно явно инициализировать с помощью функции make.

Пример:
var m map[int]int
// m[1] = 1 // Вызовет панику
m = make(map[int]int)
m[1] = 1 // Теперь работает
👍142
Как избежать состояния гонки?

Используйте мьютексы (sync.Mutex):
Мьютекс блокирует доступ к ресурсу, пока горутина не освободит его.
Пример:
gopackage main
import (
«fmt»
«sync»
)
var counter int
var mu sync.Mutex
func increment(wg *sync.WaitGroup) {
defer wg.Done()
for i := 0; i < 1000; i++ {
mu.Lock() // Блокируем доступ
counter++
mu.Unlock() // Освобождаем доступ
}
}
func main() {
var wg sync.WaitGroup
wg.Add(2)
go increment(&wg)
go increment(&wg)
wg.Wait()
fmt.Println(«Counter:», counter) // Правильное значение}


Используйте каналы для синхронизации:
Каналы позволяют передавать данные между горутинами, избегая прямого доступа к разделяемой памяти.
Пример:
gopackage main
import «fmt»
func main() {
ch := make(chan int)
go func() {
sum := 0
for i := 0; i < 1000; i++ {
sum++
}
ch <- sum
}()
result := <-ch
fmt.Println(«Result:», result) // Гарантированно корректное значение}

Используйте атомарные операции (sync/atomic):
Для операций инкремента, декремента и чтения/записи целых чисел используйте пакет sync/atomic.
Пример:
gopackage main
import ( «fmt» «sync» «sync/atomic»)

var counter int64
func increment(wg *sync.WaitGroup) {
defer wg.Done()
for i := 0; i < 1000; i++ {
atomic.AddInt64(&counter, 1) // Атомарное увеличение
}
}
func main() {
var wg sync.WaitGroup
wg.Add(2)
go increment(&wg)
go increment(&wg)
wg.Wait()
fmt.Println(«Counter:», counter) // Корректное значение}

Минимизируйте разделяемое состояние:
Старайтесь проектировать программу так, чтобы каждая горутина работала с собственными данными. Это снижает вероятность состояния гонки.

Используйте инструменты для обнаружения состояния гонки:
Go предоставляет встроенный инструмент -race для выявления состояния гонки.
Пример запуска:
go run -race main.go


Понимайте порядок работы горутин:
Горутины не гарантируют порядок выполнения. Используйте механизмы синхронизации (sync.WaitGroup, каналы) для управления их завершением.
👍11
Черные скидки на курсы в Академии!

-40% до конца ноября

🔥 В честь Черной пятницы до 30 ноября запускаем распродажу на все курсы proglib.academy и дарим промокод на сумму 10 000 на технику в магазине DigitalRazor (отправим вам по запросу)

🎁 Анонс новогоднего сюрприза!

🎄 Те, кто успеет приобрести курсы с 27 ноября по 27 декабря, получат шанс выиграть крутой новогодний подарок.
Что это будет, пока держим в секрете – следите за новостями на нашем канале!

Почему стоит выбрать нас?

⚫️ Опытные преподаватели
Вас будут обучать доценты ВМК МГУ по математике, а алгоритмы расскажет разработчик из Яндекса и преподаватель МФТИ и НИУ ВШЭ.

⚫️ Бессрочный доступ ко всем курсам
Проходите обучение в удобном для вас темпе, без давления жестких сроков.

⚫️ Поддержка преподавателей
Не останетесь одни — вам всегда помогут разобраться с трудными темами и ответят на любые вопросы через чат и платформу Coreapp.

👉 Не уверены, подойдет ли вам курс? Начните с бесплатных вводных занятий и познакомьтесь с преподавателями и форматом обучения –

Ждем вас на обучении! 🙌
👍2
This media is not supported in your browser
VIEW IN TELEGRAM
Лучшие ресурсы, чтобы не отставать от трендов из мира Go.

👣 Golang Go - авторский канал, посвященный Go разработке, Devops и созданию высоконагруженных сервисов.

📚 Golang books редкая литература , статьи, курсы и уникальные гайды для Golang специалистов любого уровня. Читайте, развивайтесь, практикуйте.

💼 Golang Jobs — актуальные предложения для Golang разработчиков от самых крупных работодателей и лидеров рынка.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🥰2🤩2
Как используется оператор select в Go?

Оператор select в Go используется для работы с несколькими каналами одновременно. Это позволяет горутине ожидать события на нескольких каналах и блокировать выполнение до тех пор, пока не произойдёт одно из событий (например, получение данных с канала).

🛠 select работает подобно конструкции switch, но вместо проверки значений переменных, она проверяет операции с каналами. Когда одна из операций с каналом завершается, выполняется соответствующий блок кода.
🔥6👍5
This media is not supported in your browser
VIEW IN TELEGRAM
⚡️ Напоминаем: у нас можно (и нужно) купить рекламу

→ Более 60 телеграм-каналов по всем направлениям IT
→ Почти 1,2 миллиона аудитории
→ Собственное медиа и сайт с DAU 25 000 — можем усилить продвижение
→ Классные email-рассылки
→ И, конечно же, крутые контент-менеджеры, которые сделают нативную интеграцию/придумают виральный пост/реализуют любые контентные предпочтения

Для заказа пишите сюда: @proglib_adv
👍1
Как форматировать исходный код на Go идиоматично?

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

🎯 Идиоматичное форматирование Go-кода достигается с помощью встроенного инструмента gofmt, который автоматически приводит код к стандартному стилю, обеспечивая консистентность отступов и пробелов. Рекомендуется использовать goimports для управления импортами, автоматически добавляя или удаляя их по необходимости. Интеграция этих инструментов в редакторы кода, такие как VS Code или GoLand, позволяет автоматически форматировать код при сохранении.
🥱7👏4👍1😢1
🎉 Розыгрыш от Proglib Academy и DigitalRazor!

С 27 ноября по 27 декабря у вас есть шанс не только прокачать свои навыки, но и выиграть ПК при покупке любого курса Академии!

🎁 Призы для участников акции:

Игровой ПК DigitalRazor ProGaming
VIP-пакет курса Proglib Academy

💡 Как принять участие?
Купите любой курс Proglib Academy с 27 ноября по 27 декабря и получите шанс выиграть мощный ПК.

Приобретите технику DigitalRazor — участвуйте в розыгрыше VIP курса.

📅 Вместе с DigitalRazor мы создали спецпредложение -50% на курсы до 30 ноября, чтобы вы могли начать обучение на более выгодных условиях.

Выбрать курс
Что такое «goroutine leak», как его можно предотвратить и как диагностировать такие утечки?

goroutine leak — это ситуация, когда горутина продолжает работать, несмотря на то, что её задача завершена или больше не актуальна, что приводит к утечке памяти и ресурсов. Это может произойти, если горутина ждет на канале, блокируется или не завершает свою работу должным образом.

Причины утечек горутин:

🎯 Горутину, которая ждет данных из канала, нельзя завершить, если канал не закрыт.
🎯 Если горутина застревает в select или for без выхода, например, в ожидании данных из канала, который больше не отправляет значения.
🎯 Если горутина не проверяет context.Done() для завершения, она может продолжать работать, даже если операция больше не нужна.

Как предотвратить:
Использование контекста (context) для отмены длительных операций. Важно проверять context.Done() для своевременного завершения работы горутины.
Закрытие каналов, когда больше не требуется передавать данные, чтобы все горутины, ожидающие на этом канале, могли завершиться.
Обработка ошибок и гарантии выхода из блокирующих операций в случае ошибок или таймаутов.

Как диагностировать:
🛠️ Профилирование с помощью pprof: инструмент позволяет отслеживать активные горутины и выявлять утечки.
🛠️ Тестирование на гонки: использование команды go test -race помогает обнаружить ошибки синхронизации, которые могут привести к утечкам.
🛠️Мониторинг горутин: с помощью логирования или специфичных инструментов (например, Go-Routine Inspector) можно отслеживать, какие горутины остаются активными.
👍9
Что такое пустой интерфейс в Go? Когда его лучше использовать и когда не стоит?

«Empty interface» в Go ( interface{} ) — это интерфейс, не имеющий методов. Поскольку все типы реализуют пустой интерфейс, его можно использовать для хранения значений любых типов.

Когда использовать:
Когда нужно хранить объекты разных типов, например, в коллекциях (срезах или мапах).
Для обработки данных, тип которых заранее неизвестен, например, при работе с JSON или при передаче произвольных данных в функции.
Когда функция должна принимать различные типы данных.

Когда не использовать:
Использование скрывает типы и может привести к ошибкам на этапе выполнения. Лучше использовать конкретные типы, когда это возможно.
Преобразование типов из может быть затратным, что важно учитывать в производительных системах.
👍7
Что такое nil ошибка в Go и как её правильно обрабатывать?

Если ошибка равна nil, это означает, что операция была успешной, и можно продолжать использовать возвращённые данные. Правильная обработка nil ошибки заключается в явной проверке каждого возвращаемого значения ошибки и принятии мер в зависимости от того, является ли ошибка nil или нет.
🥱18👍7😁2👾1
В чем отличие между каналами, которые буферизуются, и небуферизованными каналами в Go?

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

Буферизованный канал имеет фиксированный размер буфера, в который можно помещать несколько элементов до того, как получатель начнёт забирать данные. Запись в канал не блокирует отправителя, если есть свободное место в буфере. Блокировка произойдёт только, если буфер заполнен.
👍12
Почему в проектах на Go разработчики часто предпочитают использовать сторонние библиотеки для логирования, такие как zap или logrus, вместо стандартного пакета log?

Они поддерживают уровни логирования (DEBUG, INFO, WARN, ERROR), что позволяет более гибко управлять выводом сообщений в зависимости от окружения. Кроме того, они предоставляют структурированное логирование, где сообщения представляют собой набор ключей и значений.
Например, лог в JSON вместо строки:
{«level»: «info», «message»: «User logged in», «user_id»: 123 }

Это особенно полезно для автоматической обработки логов в системах мониторинга, таких как ELK или Loki.
Стандартный пакет чаще всего используется для простых скриптов и CLI-приложений. Для высоконагруженных, сложных или больших приложений лучшим выбором будут сторонние библиотеки.
👍15🤔3👾3🌚1
🧑‍💻 Статьи для IT: как объяснять и распространять значимые идеи

Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.

Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.

Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.

👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
👍21
Как справляться с проблемой «fan-in» и «fan-out» в Go?

Для решения проблемы fan-out в Go нужно распределить задачи между несколькими горутинами, используя каналы. Каждая горутина обрабатывает данные и передает результаты обратно через канал. Для управления параллельными горутинами можно использовать sync.WaitGroup, чтобы гарантировать завершение всех горутин.

В случае fan-in несколько горутин отправляют результаты в один канал. Чтобы собирать данные без блокировок, используется конструкция select или дополнительные каналы для агрегации. Если горутин много, можно использовать несколько каналов для уменьшения вероятности блокировки и собрать все результаты в основной канал через select или другие механизмы синхронизации.
👍9
📈 Кадровый голод в IT: почему компании готовы платить на 13% больше

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

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

📎 Читать статью
🤔3
Что такое пакет unsafe в Go? Для чего его используют?

Пакет unsafe в Go предоставляет функции, которые позволяют обрабатывать память и данные с низким уровнем доступа, минуя некоторые ограничения безопасности языка Go. Он предоставляет инструменты для работы с памятью и типами данных, которые обычным способом в Go нельзя напрямую манипулировать.
Это пакет используется в случаях, когда нужно провести оптимизацию или взаимодействовать с системными библиотеками, где стандартные средства языка не обеспечивают необходимой гибкости.
🔥7👍4
В следующем коде происходит паника. Объясните, что именно вызывает её

ch := make(chan int, 1)
ch <- 42
close(ch)
ch <- 23


В Go запись в закрытый канал вызывает панику. Чтобы избежать этой ошибки, нужно убедиться, что мы не пытаемся записывать в канал после его закрытия.
👍11🥱21
Расскажите о механизме select в Go и как он работает с каналами при параллельной обработке данных?
Механизм select в Go — это примитив синхронизации для работы с каналами.

При использовании select:
⚙️ Блокируется выполнение потока
⚙️ Ожидается готовность одного из каналов
⚙️ При готовности нескольких каналов выбор происходит случайно

Ключевые особенности:
🛠️ Позволяет синхронизировать параллельные процессы
🛠️ Предотвращает взаимные блокировки
🛠️ Обеспечивает недетерминированный выбор канала

Применяется для эффективного управления конкурентностью в Go.
🔥6👍21
Поддерживает ли Go объединённые типы?

Go не поддерживает объединённые типы напрямую, как это делают другие языки (например, TypeScript или Rust). В Go переменные всегда имеют фиксированный тип. Однако, с помощью интерфейсов и пустого интерфейса (interface{}), можно реализовать функциональность, схожую с объединёнными типами.
👍8