🔧 Задача для собеседования на Go: Реализация кастомной WaitGroup на семафоре
Условие:
Нужно реализовать аналог sync.WaitGroup с использованием семафора на базе канала. Семафор должен ожидать завершения N горутин, используя минимальные аллокации памяти.
Решение:
Пояснение:
1️⃣ Семафор реализован как канал пустых структур
2️⃣ Буферизированный канал создается с размером, равным количеству горутин
3️⃣ Каждая горутина при завершении кладет значение в канал (
4️⃣ Главная горутина ожидает завершения всех горутин, вычитывая значения (
5️⃣ Когда все горутины завершатся, канал опустеет и выполнение продолжится
@golang_interview
Условие:
Нужно реализовать аналог sync.WaitGroup с использованием семафора на базе канала. Семафор должен ожидать завершения N горутин, используя минимальные аллокации памяти.
Решение:
package main
import (
"fmt"
)
type sema chan struct{}
func New(n int) sema {
return make(sema, n)
}
func (s sema) Inc(k int) {
for i := 0; i < k; i++ {
s <- struct{}{}
}
}
func (s sema) Dec(k int) {
for i := 0; i < k; i++ {
<-s
}
}
func main() {
numbers := []int{1, 2, 3, 4, 5}
n := len(numbers)
sem := New(n)
for _, num := range numbers {
go func(n int) {
fmt.Println(n)
sem.Inc(1)
}(num)
}
sem.Dec(n)
}
Пояснение:
1️⃣ Семафор реализован как канал пустых структур
chan struct{}
для минимизации аллокаций2️⃣ Буферизированный канал создается с размером, равным количеству горутин
3️⃣ Каждая горутина при завершении кладет значение в канал (
Inc
)4️⃣ Главная горутина ожидает завершения всех горутин, вычитывая значения (
Dec
)5️⃣ Когда все горутины завершатся, канал опустеет и выполнение продолжится
@golang_interview
❤12👍6🔥3🌚1
🐹 Совет по использованию переменных в Go
В Go компилятор требует, чтобы все объявленные переменные и импорты были использованы в коде — иначе возникнет ошибка. Это помогает поддерживать высокую скорость компиляции, но затрудняет жизнь разработчикам.
Для таких случаев используйте пустой идентификатор (_) в качестве заглушки. Например, когда нужно проигнорировать возвращаемое значение функции или временно отключить проверку неиспользуемого импорта.
@golang_interview
В Go компилятор требует, чтобы все объявленные переменные и импорты были использованы в коде — иначе возникнет ошибка. Это помогает поддерживать высокую скорость компиляции, но затрудняет жизнь разработчикам.
Для таких случаев используйте пустой идентификатор (_) в качестве заглушки. Например, когда нужно проигнорировать возвращаемое значение функции или временно отключить проверку неиспользуемого импорта.
@golang_interview
😁16👍6
This media is not supported in your browser
VIEW IN TELEGRAM
Офер в Яндекс за 48 часов: ищем бэкендеров
В команду нужны опытные бэкенд-разработчики на C++, Python, Java и Go. Приглашаем на Мультитрек — онлайн-программу быстрой адаптации.
Всего за 2 дня вы можете получить офер:
• До 18 августа подать заявку и пройти предварительный отбор
• 23 августа решить задачи на технических секциях
• 24 августа пройти финальное собеседование и получить офер
После этого будет возможность поработать с тремя командами и выбрать проект по душе.
Создаём технологии, которые меняют мир. Присоединяйтесь! Оставляйте заявку на сайте.
Реклама. ООО "Яндекс". ИНН 7736207543
В команду нужны опытные бэкенд-разработчики на C++, Python, Java и Go. Приглашаем на Мультитрек — онлайн-программу быстрой адаптации.
Всего за 2 дня вы можете получить офер:
• До 18 августа подать заявку и пройти предварительный отбор
• 23 августа решить задачи на технических секциях
• 24 августа пройти финальное собеседование и получить офер
После этого будет возможность поработать с тремя командами и выбрать проект по душе.
Создаём технологии, которые меняют мир. Присоединяйтесь! Оставляйте заявку на сайте.
Реклама. ООО "Яндекс". ИНН 7736207543
🤣26🥴6
⚡ Прорыв в алгоритмах: найден способ считать кратчайшие пути быстрее Дейкстры
Учёные придумали новый метод для поиска кратчайших путей в ориентированных графах (с неотрицательными весами), который работает быстрее классического алгоритма Дейкстры.
📌 Что изменилось
— Дейкстра много лет считался почти пределом скорости: O(m + n log n).
— Новый алгоритм ломает эту границу и делает это за O(m log^(2/3) n).
— Особенно заметно ускорение на разреженных графах (где рёбер гораздо меньше, чем n²).
💡 Как это работает (вкратце)
— Вместо глобальной сортировки всех вершин — разбивка задачи на мелкие управляемые части.
— Используется смесь идей из Дейкстры и Беллмана–Форда: приоритеты + несколько проходов по рёбрам.
— Такая “умная” обработка фронтира экономит время и обходит старое узкое место.
🚀 Зачем это нужно
— Быстрее решаются задачи в навигации, графах дорог, сетях и планировании.
— Доказано, что Дейкстра — не предел, и можно ещё ускорять поиск кратчайших путей.
📚 Читать cтатью полностью
@golang_interview
Учёные придумали новый метод для поиска кратчайших путей в ориентированных графах (с неотрицательными весами), который работает быстрее классического алгоритма Дейкстры.
📌 Что изменилось
— Дейкстра много лет считался почти пределом скорости: O(m + n log n).
— Новый алгоритм ломает эту границу и делает это за O(m log^(2/3) n).
— Особенно заметно ускорение на разреженных графах (где рёбер гораздо меньше, чем n²).
💡 Как это работает (вкратце)
— Вместо глобальной сортировки всех вершин — разбивка задачи на мелкие управляемые части.
— Используется смесь идей из Дейкстры и Беллмана–Форда: приоритеты + несколько проходов по рёбрам.
— Такая “умная” обработка фронтира экономит время и обходит старое узкое место.
🚀 Зачем это нужно
— Быстрее решаются задачи в навигации, графах дорог, сетях и планировании.
— Доказано, что Дейкстра — не предел, и можно ещё ускорять поиск кратчайших путей.
📚 Читать cтатью полностью
@golang_interview
👍52🔥19❤8
- Release notes: https://go.dev/doc/go1.25
- Скачать: https://go.dev/dl/#go1.25.0
Здесь можно посмотреть интерактивную версию релиза с множеством примеров, показывающих, новые фичи и посмотоеть как они работают
@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤9🔥7👍4🎉1
Инструмент помогает:
• Тренировать ответы для HR и техблока.
• Подбирать точные формулировки и структуры ответов.
• Разбирать примеры кода и типовые задачи.
• Освежать в памяти ключевые алгоритмы и структуры данных.
• Находить и исправлять технические неточности в объяснениях.
Без «невидимых» подсказок во время интервью — только качественная подготовка. Поддерживает популярные LLM-API, работает быстро и стабильно.
Готовься умно — выходи на оффер увереннее.
📌 Github
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥3🤣3❤2🤔2