🔧 Задача для собеседования на 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🔥4🌚1
🐹 Совет по использованию переменных в Go
В Go компилятор требует, чтобы все объявленные переменные и импорты были использованы в коде — иначе возникнет ошибка. Это помогает поддерживать высокую скорость компиляции, но затрудняет жизнь разработчикам.
Для таких случаев используйте пустой идентификатор (_) в качестве заглушки. Например, когда нужно проигнорировать возвращаемое значение функции или временно отключить проверку неиспользуемого импорта.
@golang_interview
В Go компилятор требует, чтобы все объявленные переменные и импорты были использованы в коде — иначе возникнет ошибка. Это помогает поддерживать высокую скорость компиляции, но затрудняет жизнь разработчикам.
Для таких случаев используйте пустой идентификатор (_) в качестве заглушки. Например, когда нужно проигнорировать возвращаемое значение функции или временно отключить проверку неиспользуемого импорта.
@golang_interview
😁18👍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
🤣27🥴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
👍55🔥25❤10
- 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
❤15🔥9👍5🎉2
Инструмент помогает:
• Тренировать ответы для HR и техблока.
• Подбирать точные формулировки и структуры ответов.
• Разбирать примеры кода и типовые задачи.
• Освежать в памяти ключевые алгоритмы и структуры данных.
• Находить и исправлять технические неточности в объяснениях.
Без «невидимых» подсказок во время интервью — только качественная подготовка. Поддерживает популярные LLM-API, работает быстро и стабильно.
Готовься умно — выходи на оффер увереннее.
📌 Github
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🤣8🔥5❤3🤔2
Новый инженер OpenAI поделился опытом прохождения интервью в AI-стартапы и крупные компании, включая OpenAI.
1. Заботьтесь о себе — ментально и физически
Интервью — это стресс. Следите за сном, питанием, отдыхом, заручитесь поддержкой друзей и семьи.
2. Помните: цель — ваш успех
Компания и интервьюеры хотят, чтобы вы прошли. Даже если был отказ, пробуйте снова — многие успешно попадали на роль со второй попытки.
3. Получайте удовольствие от процесса
Это шанс познакомиться с интересными людьми, узнать новые технологии и потренироваться в решении задач.
4. Готовьтесь основательно
- 100 часов на задачи (LeetCode и аналоги)
- 100 часов на изучение теории и статей
- Тренируйтесь с друзьями без автодополнений и LLM-подсказок
5. Каждая встреча важна
Даже «неформальный звонок» — это возможность показать мотивацию, характер и профессионализм.
6. Работайте над профилем и сетью
LinkedIn, GitHub с проектами, участие в митапах, open-source, хакатонах — всё это привлечёт внимание рекрутеров.
7. Первые звонки
- С рекрутером: записывайте детали — этапы, состав команды, имя руководителя
- С руководителем: изучите его публикации и проекты, покажите интерес, расскажите, почему хотите работать именно здесь
8. Поведенческие вопросы
Готовьте истории по формату STAR(I) — о том, как решали конфликты, брали на себя лидерство, справлялись с ошибками.
9. Техническая часть
- Решайте задачи быстро и чётко, проговаривая ход мыслей
- Практикуйте кодинг в условиях стресса и без IDE
- Разбирайтесь в алгоритмах, трансформерах, RL-методах
- Умейте объяснить свою текущую работу и её пользу для компании
10. Переговоры
Обсуждайте не только зарплату, но и команду, миссию, культуру. Все договорённости фиксируйте письменно.
11. Принятие решения
Выбирайте место, где вам будет комфортно работать каждый день.
📌 Главное: интервью — это навык, который можно натренировать. Подготовка + уверенность = высокий шанс успеха.
📌 Полный текст
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱15❤5👍3🔥2
🦠 Совет по Golang
В Go для корректной обработки ошибок рекомендуется использовать функции
В отличие от простого сравнения через
@golang_interview
В Go для корректной обработки ошибок рекомендуется использовать функции
errors.Is
и errors.As
. Они позволяют работать даже с обёрнутыми ошибками, извлекая их исходное значение.В отличие от простого сравнения через
==,
такой подход надёжнее, так как учитывает всю цепочку ошибок. Например, errors.Is
проверяет, содержится ли конкретная ошибка где-то внутри обёрнутой, а errors.As
извлекает её для дальнейшего анализа. @golang_interview
👍19❤6🔥5😁2
🔎 Задача на Go с подвохом
Код:
Вопрос: Что выведет этот код?
Варианты ответа:
A.
B.
C.
D.
Правильный ответ:B
Объяснение:
1. Создается срез с длиной 3 и capacity 4, заполненный значениями [1, 2, 3]
2. При передаче в функцию modifySlice:
— append добавляет элемент 4, но не вызывает переаллокацию
— Изменение s[0] = 100 применяется к тому же underlying массиву
3. Однако исходный срез в main() останется длины 3, но первый элемент изменится:
— Длина среза в main не меняется
— Но изменения элементов видны, так как используется тот же массив
@golang_interview
Код:
package main
import "fmt"
func main() {
s := make([]int, 3, 4) // Длина 3, capacity 4
s[0], s[1], s[2] = 1, 2, 3
modifySlice(s)
fmt.Println(s)
}
func modifySlice(s []int) {
s = append(s, 4)
s[0] = 100
}
Вопрос: Что выведет этот код?
Варианты ответа:
A.
[1 2 3]
B.
[100 2 3]
C.
[1 2 3 4]
D.
[100 2 3 4]
Правильный ответ:
Объяснение:
1. Создается срез с длиной 3 и capacity 4, заполненный значениями [1, 2, 3]
2. При передаче в функцию modifySlice:
— append добавляет элемент 4, но не вызывает переаллокацию
— Изменение s[0] = 100 применяется к тому же underlying массиву
3. Однако исходный срез в main() останется длины 3, но первый элемент изменится:
— Длина среза в main не меняется
— Но изменения элементов видны, так как используется тот же массив
@golang_interview
🔥28👍6❤4😁2🥱1
Встраивайте файлы прямо в Go-код с помощью пакета embed и директивы
//go:embed
. Это работает как для отдельных файлов, так и для целых директорий:
import _ "embed"
//go:embed config.json
var config []byte
//go:embed version.txt
var version string
//go:embed templates/*
var templates embed.FS
📌 Удобно для:
- конфигов
- файлов с версией
- HTML-шаблонов
- любых статических ресурсов
Please open Telegram to view this post
VIEW IN TELEGRAM
👍31❤11🔥7
📊 SlimToolkit — инструмент для оптимизации Docker-образов
Проект из песочницы CNCF помогает уменьшать размер контейнеров до 30 раз без изменения исходного кода. Он анализирует приложение внутри контейнера, определяет необходимые зависимости и создает минималистичный образ.
Инструмент помимо уменьшения размера, автоматически генерирует Seccomp и AppArmor профили для повышения безопасности. Поддерживает образы на Node.js, Python, Ruby, Java, Go и других стеках.
🤖 GitHub
@golang_interview
Проект из песочницы CNCF помогает уменьшать размер контейнеров до 30 раз без изменения исходного кода. Он анализирует приложение внутри контейнера, определяет необходимые зависимости и создает минималистичный образ.
Инструмент помимо уменьшения размера, автоматически генерирует Seccomp и AppArmor профили для повышения безопасности. Поддерживает образы на Node.js, Python, Ruby, Java, Go и других стеках.
🤖 GitHub
@golang_interview
👍5🔥4❤3
Команда Ozon Tech готовит мощнейший трек по бэкенду в рамках своей конференции E-CODE 💙
И это только одна из причин, почему стоит быть там 13-14 сентября. А ещё: качественный нетворк, 1х1 с топовыми IT-экспертами и HR, эксклюзивный мерч и интерактивы, вечеринки с участием НТР, Заточки, ILWT и Нейромонаха Феофана.
Успейте зарегистрироваться. Это обязательно⬅
И это только одна из причин, почему стоит быть там 13-14 сентября. А ещё: качественный нетворк, 1х1 с топовыми IT-экспертами и HR, эксклюзивный мерч и интерактивы, вечеринки с участием НТР, Заточки, ILWT и Нейромонаха Феофана.
Успейте зарегистрироваться. Это обязательно
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱7👍1
🧪 Миф о стеке и куче в Go
Из-за этой схемы существует ошибочное представление о том, что переменные стека имеют более высокие адреса, чем переменные кучи. В Go это неверно.
Во первых: эта диаграмма появилась в эпоху, когда процесс имел ровно один поток.
Во вторых: на схеме показывается стек потоков, а не стек горутин.
Стек горутин выделяется средой выполнения из памяти, управляемой кучей, поэтому он может находиться как выше, так и ниже адресов переменных кучи. Более того, стек горутин способен динамически перемещаться и увеличиваться по мере роста программы, что полностью разрушает иллюзию фиксированного расположения
Из-за этой схемы существует ошибочное представление о том, что переменные стека имеют более высокие адреса, чем переменные кучи. В Go это неверно.
Во первых: эта диаграмма появилась в эпоху, когда процесс имел ровно один поток.
Во вторых: на схеме показывается стек потоков, а не стек горутин.
Стек горутин выделяется средой выполнения из памяти, управляемой кучей, поэтому он может находиться как выше, так и ниже адресов переменных кучи. Более того, стек горутин способен динамически перемещаться и увеличиваться по мере роста программы, что полностью разрушает иллюзию фиксированного расположения
👍15❤2🔥2
🚀 Zig показывает мощь метапрограммирования на компайм-тайме
Смотрите, как можно вызвать разные методы у разных структур, используя одно универсальное определение функции:
Смотрите, как можно вызвать разные методы у разных структур, используя одно универсальное определение функции:
const std = @import("std");
const T = struct {
fn name() []const u8 {
return "foo";
}
fn foo() void {
std.debug.print("T.foo\n", .{});
}
};
const S = struct {
fn name() []const u8 {
return "bar";
}
fn bar() void {
std.debug.print("S.bar\n", .{});
}
};
fn f(Type: type) void {
@field(Type, Type.name())();
}
pub fn main() !void {
f(T); // <=> T.foo()
f(S); // <=> S.bar()
}
❤5❤🔥3🔥1
👉Прокачайте знания Go на практическом онлайн-курсе
За 7 уроков вы научитесь писать простые сервисы и использовать Go в некоторых рабочих задачах — например, тестировать с его помощью Kubernetes и запускать fuzzing-тесты.
А еще — получите подборку материалов для большего погружения в тему.
Переходите в Академию Selectel и начните обучение: https://slc.tl/xkhjw
Реклама. АО «Селектел», ИНН 7810962785, ERID: 2VtzqwTELHY
За 7 уроков вы научитесь писать простые сервисы и использовать Go в некоторых рабочих задачах — например, тестировать с его помощью Kubernetes и запускать fuzzing-тесты.
А еще — получите подборку материалов для большего погружения в тему.
Переходите в Академию Selectel и начните обучение: https://slc.tl/xkhjw
Реклама. АО «Селектел», ИНН 7810962785, ERID: 2VtzqwTELHY