🛠 Go tip: как правильно использовать
⚡ Важные моменты:
- GC может очистить пул — он не вечное хранилище.
- Объекты нужно сбрасывать перед возвратом, иначе вернутся «грязные» данные.
- Для больших или сильно разных по размеру объектов может привести к перерасходу памяти.
✅ Рекомендации:
- Использовать только для короткоживущих и предсказуемых объектов.
- Сбрасывать или обнулять состояние перед
- Профилировать приложение (`pprof`, `MemStats`) и смотреть эффект.
📌 Пример:
👉 Подробнее
sync.Pool
sync.Pool
— это потокобезопасный пул временных объектов в Go. Он помогает переиспользовать объекты, снижая аллокации и нагрузку на GC. Отлично подходит для буферов и временных структур. ⚡ Важные моменты:
- GC может очистить пул — он не вечное хранилище.
- Объекты нужно сбрасывать перед возвратом, иначе вернутся «грязные» данные.
- Для больших или сильно разных по размеру объектов может привести к перерасходу памяти.
✅ Рекомендации:
- Использовать только для короткоживущих и предсказуемых объектов.
- Сбрасывать или обнулять состояние перед
Put
. - Профилировать приложение (`pprof`, `MemStats`) и смотреть эффект.
📌 Пример:
var bufPool = sync.Pool{
New: func() interface{} {
return make([]byte, 1024) // создаём буфер 1КБ
},
}
func process() {
buf := bufPool.Get().([]byte)
defer bufPool.Put(buf[:0]) // сброс длины перед возвратом
// работа с buf...
}
👉 Подробнее
👍4❤2🔥1
Media is too big
VIEW IN TELEGRAM
- Алгоритмы и структуры данных
- «Найдите k-й элемент в отсортированных массивах без слияния»
- «Минимальное окно подстроки с набором символов»
- «Пути с минимальной стоимостью в графе с ловушками/порталами»
- Системный дизайн (Senior+)
- «Спроектируйте сокращатель ссылок с 10 млрд кликов/день»
- «Реал-тайм чат с end-to-end доставкой и поиском по истории»
- «Видео-платформа: загрузка, хранение, CDN, рекомендации»
- Конкурентность и распределённые системы
- «Счётчик с глобальной монотонностью на шардированном кластере»
- «Идемпотентная очередь задач при ретраях и дедупликации»
- Поведенческие (бар-рейзер)
- «Расскажите про провал и чему вы научились»
- «Как вы влияли без формальных полномочий»
📌 Как решать задачи с кодом (шаблон)
1) Уточните ограничения и формат ввода/вывода.
2) Проговорите наивное решение → оценка O(...) по времени/памяти.
3) Предложите улучшение (двойной указатель, heap, prefix, DP, BFS/DFS, binary search on answer).
4) Кодируйте чисто: небольшие функции, проверки краёв, именование.
5) Прогоны тестов: пустой ввод, дубликаты, большие размеры, Unicode и т. п.
6) Завершите: сложность, варианты оптимизации, trade-offs.
🛠 **Системный дизайн — скелет ответа**
- Требования: функциональные/нефункциональные (RPS, латентность, доступность).
- API/схемы данных → оценка объёмов (QPS, storage, рост).
- Высокоуровневая архитектура: клиент, API-шлюз, сервисы, БД, кэш, очередь, CDN.
- Горячие пути: чтение/запись, кэширование, индексирование, консистентность.
- Масштабирование: шардинг, репликация, партиционирование, backpressure.
- Надёжность: ретраи, идемпотентность, дедупликация, алерты, SLO/SLI.
- Трейд-оффы и поэтапный rollout.
- Пишете код сразу, не уточнив ограничения.
- Нет тестов на крайние случаи.
- Перескакиваете в микро-детали дизайна, не зафиксировав требования.
- Не называете trade-offs и метрики успеха.
🔖 Мини-шпаргалка по инструментам
- Два указателя — подстроки/окна/парные суммы.
- Heap/priority queue — k-наилучших элементов/поток слияния.
- Prefix/Suffix/Hash — подсчёты и проверки за O(1) на запрос.
- DP — оптимизация по состояниям (категории: линейная, на подмасках, по интервалам).
- Graph — BFS (минимум шагов), Dijkstra/0-1 BFS (взвешенные), Topo sort (DAG).
- «Binary search по ответу» — задачи вида «можно/нельзя при X».
1) Разделите тренировки: 60% кодинг, 25% дизайн, 15% поведенческие.
2) Решайте задачники по темам и фиксируйте паттерн решения (а не только код).
3) Мок-интервью: таймер 30–45 минут, проговаривайте мысли вслух.
4) Соберите портфель историй по STAR: конфликт, лидерство, фейл, влияние на метрики.
Удачи на интервью!
👉 Полное видео
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13👍5❤3🥱1
🚀 Ошибки с
В статье “Avoiding Common sync.WaitGroup Mistakes in Go” Джон Калхаун разбирает, как Go 1.25 помогает избежать частых ошибок при использовании
### 🔹 Ошибка:
Часто встречающийся неправильный код:
❌ Проблема: wg.Add(1) вызывается уже внутри горутины. Она может не успеть выполниться до wg.Wait(), из-за чего программа зависает или ведёт себя некорректно.
✅ В Go 1.25 go vet теперь предупреждает:
“WaitGroup.Add called from inside new goroutine”
Правильный вариант:
🔹 Новый метод wg.Go()
Go 1.25 добавил удобный метод Go, который сам вызывает Add и Done:
Этот код эквивалентен такому:
✅ Итог
- go vet теперь ловит ошибки, когда wg.Add вызывается внутри горутины.
- Новый метод wg.Go(...) упрощает код и снижает риск ошибок.
Подробнее: https://www.calhoun.io/avoiding-common-sync-waitgroup-mistakes/
sync.WaitGroup
в Go и что нового в Go 1.25 В статье “Avoiding Common sync.WaitGroup Mistakes in Go” Джон Калхаун разбирает, как Go 1.25 помогает избежать частых ошибок при использовании
sync.WaitGroup
. ### 🔹 Ошибка:
wg.Add
внутри горутины Часто встречающийся неправильный код:
for i := 0; i < 5; i++ {
go func() {
wg.Add(1)
defer wg.Done()
// работа…
}()
}
wg.Wait()
❌ Проблема: wg.Add(1) вызывается уже внутри горутины. Она может не успеть выполниться до wg.Wait(), из-за чего программа зависает или ведёт себя некорректно.
✅ В Go 1.25 go vet теперь предупреждает:
“WaitGroup.Add called from inside new goroutine”
Правильный вариант:
for i := 0; i < 5; i++ {
wg.Add(1)
go func() {
defer wg.Done()
// работа…
}()
}
wg.Wait()
🔹 Новый метод wg.Go()
Go 1.25 добавил удобный метод Go, который сам вызывает Add и Done:
for i := 0; i < 5; i++ {
wg.Go(func() {
// работа…
})
}
wg.Wait()
Этот код эквивалентен такому:
wg.Add(1)
go func() {
defer wg.Done()
f()
}()
✅ Итог
- go vet теперь ловит ошибки, когда wg.Add вызывается внутри горутины.
- Новый метод wg.Go(...) упрощает код и снижает риск ошибок.
Подробнее: https://www.calhoun.io/avoiding-common-sync-waitgroup-mistakes/
❤27👍9👏6🎉3🥰1
🚀 Docker + Go pro tip
Go идеально подходит для Docker, так как можно собрать статически слинкованный бинарь и запускать его в ультра-лёгком образе.
💡 Такой приём:
- даёт контейнер весом в несколько МБ,
- убирает лишние зависимости,
- ускоряет доставку и запуск приложения.
@golang_interview
Go идеально подходит для Docker, так как можно собрать статически слинкованный бинарь и запускать его в ультра-лёгком образе.
# Этап сборки
FROM golang:1.23 AS builder
WORKDIR /src
COPY . .
RUN go mod download
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o app .
# Финальный минимальный образ
FROM scratch
WORKDIR /app
COPY --from=builder /src/app .
ENTRYPOINT ["./app"]
💡 Такой приём:
- даёт контейнер весом в несколько МБ,
- убирает лишние зависимости,
- ускоряет доставку и запуск приложения.
@golang_interview
❤12🥱8👍4🔥2
Введение. Собеседования на позиции, связанные с данными (аналитики, инженеры, ученые данных), всё чаще включают нестандартные и продвинутые вопросы по SQL.
Большие технологические компании (Google, Amazon и др.) предъявляют высокие требования: важна не только правильность запроса, но и умение оптимизировать его и разбираться в реальных бизнес-данных.
В этом гайде мы разберем категории наиболее распространенных сложных SQL-задач с реальных собеседований – от платформ вроде DataLemur, LeetCode, StrataScratch – и подробно поясним решения.
Каждая задача сопровождена анализом: условие, оптимальный подход, используемые SQL-конструкции, возможные ошибки и финальное решение (для PostgreSQL и MySQL, с указанием различий где необходимо).
В конце добавлен отдельный раздел о современных базах данных, включая векторные БД (Pinecone, Weaviate, Milvus и др.), с примерами того, что могут спросить про них на собеседовании и как выглядят SQL-подобные запросы для работы с векторами.
📌 Читать гайд
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6👍3❤2
🚀 Микросервисная платформа для страхования
Yosef — это открытая микросервисная платформа для финансовой страховой отрасли, разработанная на .NET, Python, TypeScript и Golang. Она обеспечивает масштабируемость, гибкость и высокую наблюдаемость для современных страховых приложений.
🚀 Основные моменты:
- Микросервисная архитектура для легкости масштабирования
- Централизованное управление идентификацией и доступом
- Полный цикл страхования от оценки до создания полиса
- Высокая наблюдаемость с использованием Grafana и Prometheus
- Интеграция с современными инструментами безопасности
📌 GitHub: https://github.com/elyosemite/Yosef
#csharp
Yosef — это открытая микросервисная платформа для финансовой страховой отрасли, разработанная на .NET, Python, TypeScript и Golang. Она обеспечивает масштабируемость, гибкость и высокую наблюдаемость для современных страховых приложений.
🚀 Основные моменты:
- Микросервисная архитектура для легкости масштабирования
- Централизованное управление идентификацией и доступом
- Полный цикл страхования от оценки до создания полиса
- Высокая наблюдаемость с использованием Grafana и Prometheus
- Интеграция с современными инструментами безопасности
📌 GitHub: https://github.com/elyosemite/Yosef
#csharp
GitHub
GitHub - elyosemite/Yosef: Yosef is a comprehensive, open-source microservices built with .NET C#, Python, Typescript and Gleam…
Yosef is a comprehensive, open-source microservices built with .NET C#, Python, Typescript and Gleam for the financial insurance industry. It provides a robust, scalable and observable foundation i...
👍3❤2🔥2🌚2🌭2🐳1
Хотите попробовать себя в бэкенде, но страшно уйти от фронта?
Это чувство знакомо каждому фронтендеру: сложно оставить родной JS и Webpack и отправиться в неизведанный мир API, баз данных и Docker.
На открытом уроке мы покажем, что переход на Golang — это проще, чем кажется. Вместе разберём, как перенести знакомые фронтендеру навыки в мир Go, создадим работающий API всего за 15 минут и убедимся, что Go — это удобно, логично и выгодно.
📅 Не упускайте шанс открыть для себя новые горизонты в разработке! Встречаемся 17 сентября в 20:00 МСК.
👉 Запишитесь на открытый урок → https://tglink.io/e9b05b52aa38?erid=2W5zFG1cUV6
Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.
Это чувство знакомо каждому фронтендеру: сложно оставить родной JS и Webpack и отправиться в неизведанный мир API, баз данных и Docker.
На открытом уроке мы покажем, что переход на Golang — это проще, чем кажется. Вместе разберём, как перенести знакомые фронтендеру навыки в мир Go, создадим работающий API всего за 15 минут и убедимся, что Go — это удобно, логично и выгодно.
📅 Не упускайте шанс открыть для себя новые горизонты в разработке! Встречаемся 17 сентября в 20:00 МСК.
👉 Запишитесь на открытый урок → https://tglink.io/e9b05b52aa38?erid=2W5zFG1cUV6
Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.
🤣4
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔6👍2🔥2🥰1
Совет на 2025 год — переходите на Go.
На Go собирают банки, маркетплейсы и highload-сервисы. Зарплаты мидлов начинаются от 200 000 ₽, а у сеньоров доходят до 600 000 ₽.
А чтобы освоить его всего за 3 месяца — изучите канал Максима Аверина.
Его бэкграунд: Senior Golang/Python (X5, Lamoda, BestDoctor), 7 лет в бэкенде, экс-тимлид и PM, 300+ собеседований с 2018
На канале вы найдёте:
— Советы, которые в разы повысят ваши шансы на перекат в Go
— Как легко выбивать себе ту ЗП, которую желаете: скрипты переговоров и шаблоны писем
— Как сделать мощный проект с code-review и уже через три недели пойти на собесы.
Огромный опыт, который ты можешь перенять абсолютно бесплатно. Переходи и изучай: @maksim_golang
На Go собирают банки, маркетплейсы и highload-сервисы. Зарплаты мидлов начинаются от 200 000 ₽, а у сеньоров доходят до 600 000 ₽.
А чтобы освоить его всего за 3 месяца — изучите канал Максима Аверина.
Его бэкграунд: Senior Golang/Python (X5, Lamoda, BestDoctor), 7 лет в бэкенде, экс-тимлид и PM, 300+ собеседований с 2018
На канале вы найдёте:
— Советы, которые в разы повысят ваши шансы на перекат в Go
— Как легко выбивать себе ту ЗП, которую желаете: скрипты переговоров и шаблоны писем
— Как сделать мощный проект с code-review и уже через три недели пойти на собесы.
Огромный опыт, который ты можешь перенять абсолютно бесплатно. Переходи и изучай: @maksim_golang
🤣15👍3
🧩 Кастомизируемый JavaScript-парсер с минимальным ядром
Идея проста: ядро парсера — максимально маленькое. Все «дорогие» фичи JS включаются опционально. Так вы получаете нужный синтаксис без лишних накладных расходов.
🔧 Что это даёт
- Меньше зависимостей и памяти.
- Быстрее разбор там, где не нужен весь JS (например, без `class/async/regex`).
- Гибкая сборка под конкретный продукт: от валидации шаблонов до мини-рантайма.
🧱 Архитектура
- Feature flags: подключайте только нужные конструкции (например,
- Модульный AST: узлы для отключённых фич не создаются.
- Стримовый лексер: позволяет парсить большие файлы без полного буфера.
- Sandbox-режим: строгие лимиты глубины/времени для безопасной обработки.
▶️ Пример (Go, условный API)
https://github.com/xjslang/xjs
Идея проста: ядро парсера — максимально маленькое. Все «дорогие» фичи JS включаются опционально. Так вы получаете нужный синтаксис без лишних накладных расходов.
🔧 Что это даёт
- Меньше зависимостей и памяти.
- Быстрее разбор там, где не нужен весь JS (например, без `class/async/regex`).
- Гибкая сборка под конкретный продукт: от валидации шаблонов до мини-рантайма.
🧱 Архитектура
- Feature flags: подключайте только нужные конструкции (например,
import
, jsx
, template
, `async`).- Модульный AST: узлы для отключённых фич не создаются.
- Стримовый лексер: позволяет парсить большие файлы без полного буфера.
- Sandbox-режим: строгие лимиты глубины/времени для безопасной обработки.
▶️ Пример (Go, условный API)
package main
import (
"context"
"time"
"example.com/jsparser"
)
func main() {
ctx, cancel := context.WithTimeout(context.Background(), 200*time.Millisecond)
defer cancel()
p := jsparser.New(jsparser.Options{
Features: jsparser.Enable(
jsparser.Base, // идентификаторы, выражения, блоки
jsparser.ImportESM, // поддержка import/export
jsparser.TemplateLit, // шаблонные строки
// jsparser.Class, // можно не включать
// jsparser.Async, // можно не включать
// jsparser.JSX, // включайте по надобности
),
MaxDepth: 512,
MaxTokens: 2_000_000,
})
ast, err := p.Parse(ctx, []byte(`import x from "./m.js"; const s = `+"`hi ${x}`"+`;`))
if err != nil {
panic(err)
}
_ = ast // используйте AST для анализа/трансформаций
}
https://github.com/xjslang/xjs
🔥1