Pipeline — это паттерн конкурентного программирования в Go, где данные проходят через последовательность этапов обработки, соединённых каналами. Каждый этап выполняется в отдельной горутине.
Генератор — создаёт данные и отправляет их в канал. Это источник данных, который не принимает входящих каналов, только возвращает исходящий.
Обработчик — получает данные из входящего канала, выполняет преобразования и отправляет результат в исходящий канал. Таких этапов может быть несколько, они соединяются последовательно.
Потребитель — принимает финальные данные из канала и использует их: выводит, сохраняет, агрегирует. Это конечная точка конвейера.
Рассмотрим обработку потока чисел: генерация → фильтрация чётных → возведение в квадрат.
package main
import "fmt"
// Generator: генерирует числа от 1 до n
func generate(n int) <-chan int {
out := make(chan int)
go func() {
defer close(out)
for i := 1; i <= n; i++ {
out <- i
}
}()
return out
}
// Processor 1: фильтрует только чётные числа
func filterEven(in <-chan int) <-chan int {
out := make(chan int)
go func() {
defer close(out)
for num := range in {
if num%2 == 0 {
out <- num
}
}
}()
return out
}
// Processor 2: возводит числа в квадрат
func square(in <-chan int) <-chan int {
out := make(chan int)
go func() {
defer close(out)
for num := range in {
out <- num * num
}
}()
return out
}
// Consumer: выводит результаты
func main() {
// Строим pipeline
numbers := generate(10)
evens := filterEven(numbers)
squares := square(evens)
// Потребляем результаты
for result := range squares {
fmt.Println(result) // 4, 16, 36, 64, 100
}
}
Конкурентность — все этапы работают одновременно. Пока генератор создаёт следующее число, обработчик уже обрабатывает предыдущее, а потребитель выводит готовый результат.
Модульность — каждый этап независим и переиспользуем. Можно легко добавлять, удалять или заменять звенья конвейера.
Эффективность памяти — данные обрабатываются по мере поступления, без необходимости загружать всё в память сразу.
📍 Навигация: Вакансии • Задачи • Собесы
#GoDeep
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥25👍3❤2⚡1
🛠 Распределяем работу между воркерами
Fan-Out — паттерн конкурентности, когда один источник данных распределяет задачи по нескольким воркерам параллельно. Это позволяет обрабатывать данные быстрее, используя все ядра процессора.
Как это выглядит схематично
Один канал на входе → несколько горутин читают из него → результаты собираются вместе.
Ключевая идея:
Горутины конкурентно читают из одного канала. Go гарантирует, что каждое значение получит ровно одна горутина — никаких гонок, никаких дублей:
Жизненный цикл:
1. Источник кладёт задачи в jobs
2. N воркеров читают jobs конкурентно
3. После jobs закрыт → воркеры завершаются →
4. WaitGroup → close(res)
5. main читает все результаты из res
Когда применять:
— CPU-интенсивные задачи: сжатие, шифрование, парсинг
— I/O-bound задачи с независимыми запросами
— Параллельная обработка батчей данных
Когда НЕ применять:
— Задачи зависят друг от друга
— Нужен строгий порядок результатов
— Слишком лёгкие задачи, когда накладные расходы > выгода
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека Go-разработчика
#GoDeep
Fan-Out — паттерн конкурентности, когда один источник данных распределяет задачи по нескольким воркерам параллельно. Это позволяет обрабатывать данные быстрее, используя все ядра процессора.
Как это выглядит схематично
┌─────────────┐
│ источник │
└──────┬──────┘
│
┌────────┼────────┐
▼ ▼ ▼
[worker1] [worker2] [worker3]
│ │ │
└────────┼────────┘
▼
[ результат ]
Один канал на входе → несколько горутин читают из него → результаты собираются вместе.
Ключевая идея:
Горутины конкурентно читают из одного канала. Go гарантирует, что каждое значение получит ровно одна горутина — никаких гонок, никаких дублей:
func worker(id int, jobs <-chan int, results chan<- int, wg *sync.WaitGroup) {
defer wg.Done()
for j := range jobs {
results <- j * j
}
}
func main() {
jobs := make(chan int, bufSize)
results := make(chan int, bufSize)
var wg sync.WaitGroup
// стартуем воркеров
for i := 0; i < numWorkers; i++ {
wg.Add(1)
go worker(i, jobs, results, &wg)
}
// отправляем задачи
for i := 0; i < numJobs; i++ {
jobs <- i
}
close(jobs)
// отдельная горутина ждёт воркеров и закрывает results
go func() {
wg.Wait()
close(results)
}()
// читаем результаты
for r := range results {
fmt.Println(r)
}
}Жизненный цикл:
1. Источник кладёт задачи в jobs
2. N воркеров читают jobs конкурентно
3. После jobs закрыт → воркеры завершаются →
wg.Done()4. WaitGroup → close(res)
5. main читает все результаты из res
Когда применять:
— CPU-интенсивные задачи: сжатие, шифрование, парсинг
— I/O-bound задачи с независимыми запросами
— Параллельная обработка батчей данных
Когда НЕ применять:
— Задачи зависят друг от друга
— Нужен строгий порядок результатов
— Слишком лёгкие задачи, когда накладные расходы > выгода
📍 Навигация: Вакансии • Задачи • Собесы
#GoDeep
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10😢5👍4
Представьте разработчика с 4+ годами на React/React Native. Типовой рабочий цикл выглядит примерно так:
сгенерировать UI-компонент → добавить JS/TS логику → повторить
В этой модели UI — главный герой. Всё остальное — вспомогательный шум. Указатели? Управление памятью? Конкурентность? За вас давно всё решили. Фронтенд-разработчик рассказал у себя в блоге про переход на Go, потому что он устал от шума в голове.
Фронтенд-стек агрессивно абстрагирует детали. Это удобно — и это ловушка. Указатели просто не существуют в JS. Переменные — либо примитивы, либо ссылки, и вся эта механика скрыта за синтаксисом. Конкурентность — это async/await и промисы. Что происходит под капотом event loop — можно годами не знать. Зависимости растут бесконтрольно. В среднем React-проекте node_modules — это несколько тысяч пакетов.
Почему Go — это смена мышления, а не просто новый синтаксис
Go возвращает программиста к базовым вещам:
1. Указатели — снова явные
func increment(n *int) {
*n++
}Вы снова думаете о том, передаёте ли значение или адрес. Это не баг — это фича, которая возвращает контроль.
2. Стандартная библиотека вместо npm
В Go принято сначала спросить: «есть ли это в stdlib?» HTTP-сервер, JSON, криптография, конкурентность — всё это уже там. Импорт сторонней библиотеки — осознанное решение, а не рефлекс.
3. Горутины вместо колбэков
Модель конкурентности в Go — одна из самых элегантных в индустрии. Каналы, горутины и планировщик дают контроль, которого у async/await нет по определению.
4. Ошибки как значения
result, err := doSomething()
if err != nil {
return err
}
Никаких try/catch, которые легко пропустить. Ошибка — это часть сигнатуры функции. Обработка явная.
Разработчик, который переходит с React на Go, начинает по-другому думать об архитектуре всего стека:
— понимает, как работает сеть
— начинает читать про алгоритмы и структуры данных — они снова актуальны
— видит, как строятся серверы, парсеры, CLI-инструменты
Go часто описывают как «Cи с удобным синтаксисом» — и это точное ощущение для тех, кто давно не спускался ниже компонентного уровня.
📍 Навигация: Вакансии • Задачи • Собесы
#GoLive
Please open Telegram to view this post
VIEW IN TELEGRAM
❤16🥱9👾1
🛠 Cобираем результаты от множества горутин
Fan-In — паттерн, обратный Fan-Out. Несколько горутин производят данные независимо, а один канал собирает всё воедино. Это финальная часть пайплайна.
Каждый воркер пишет в свой канал → merge-функция сливает все каналы в один → потребитель читает из одного места, не зная сколько источников было.
Ключевая идея
На каждый входящий канал запускается своя горутина-переливщик. Все они пишут в общий merged. Когда все источники иссякли — merged закрывается:
Также можно отменять через контекст:
Без этого горутины-переливщики зависнут, если потребитель неожиданно отвалится.
Три правила Fan-In:
— Каждый источник сам закрывает свой канал
—
— Горутина с
Fan-Out + Fan-In вместе = полный пайплайн
Fan-Out раздаёт задачи, Fan-In собирает ответы. Между ними — изолированные воркеры без общего состояния.
Порядок результатов не гарантирован — это цена параллельности. Если порядок важен, нужно добавлять индекс к каждому результату и сортировать после сбора.
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека Go-разработчика
#GoDeep
Fan-In — паттерн, обратный Fan-Out. Несколько горутин производят данные независимо, а один канал собирает всё воедино. Это финальная часть пайплайна.
Каждый воркер пишет в свой канал → merge-функция сливает все каналы в один → потребитель читает из одного места, не зная сколько источников было.
Ключевая идея
На каждый входящий канал запускается своя горутина-переливщик. Все они пишут в общий merged. Когда все источники иссякли — merged закрывается:
func merge(channels ...<-chan int) <-chan int {
merged := make(chan int)
wg := sync.WaitGroup{}
pipe := func(c <-chan int) {
defer wg.Done()
for v := range c {
merged <- v
}
}
wg.Add(len(channels))
for _, c := range channels {
go pipe(c)
}
go func() {
wg.Wait()
close(merged)
}()
return merged
}Также можно отменять через контекст:
pipe := func(c <-chan int) {
defer wg.Done()
for {
select {
case v, ok := <-c:
if !ok {
return
}
merged <- v
case <-ctx.Done():
return
}
}
}Без этого горутины-переливщики зависнут, если потребитель неожиданно отвалится.
Три правила Fan-In:
— Каждый источник сам закрывает свой канал
—
close(merged) только после wg.Wait()— Горутина с
wg.Wait() всегда отдельная, иначе дедлокFan-Out + Fan-In вместе = полный пайплайн
Fan-Out раздаёт задачи, Fan-In собирает ответы. Между ними — изолированные воркеры без общего состояния.
Порядок результатов не гарантирован — это цена параллельности. Если порядок важен, нужно добавлять индекс к каждому результату и сортировать после сбора.
📍 Навигация: Вакансии • Задачи • Собесы
#GoDeep
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15🔥5❤3
Небольшая, но элегантная zero-dependency библиотека для Go, которая решает классическую задачу: как правильно запустить несколько фоновых процессов и корректно их завершить.
В основе лежит один интерфейс:
type Runnable interface {
Run(context.Context) error
}Завершение работы управляется через отмену контекста — всё предсказуемо и идиоматично.
Главная фича — менеджер с двухуровневой иерархией. Cначала останавливаются процессы: HTTP-серверы, воркеры, задачи по расписанию; и только потом сервисы: очереди, БД, метрики.
Менеджер сам является Runnable — значит менеджеры можно вкладывать друг в друга для независимого управления жизненным циклом.
📍 Навигация: Вакансии • Задачи • Собесы
#GoToProduction
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤3🤔2
🧑💻 Приоритизация каналов в Go
Разберём, как это починить:
Никаких гарантий, что срочное обработается первым.
Решение: двойной
Первый
Главная опасность — голодание. Если urgent забит сообщениями постоянно, normal не получит ничего никогда.
Защита — счётчик или таймер:
Простота против гибкости. Согласны с таким выбором или предпочли бы встроенный механизм?
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека Go-разработчика
#GoDeep
select выбирает кейс случайно, если готовы несколько каналов. Звучит просто, но на практике это боль: срочное сообщение может ждать в очереди, пока обрабатывается менее важное.Разберём, как это починить:
select {
case msg := <-urgent:
handle(msg)
case msg := <-normal:
handle(msg)
}Никаких гарантий, что срочное обработается первым.
Решение: двойной
selectfor {
// Сначала пробуем срочный канал
select {
case msg := <-urgent:
handle(msg)
default:
}
// Потом общий
select {
case msg := <-urgent:
handle(msg)
case msg := <-normal:
handle(msg)
}
}Первый
select с default не блокируется — он мгновенно проверяет, есть ли что-то срочное. Если да — обрабатываем и идём на следующую итерацию. Если нет — падаем во второй select и ждём любой из каналов.Главная опасность — голодание. Если urgent забит сообщениями постоянно, normal не получит ничего никогда.
Защита — счётчик или таймер:
normalTimeout := time.After(5 * time.Second)
for {
select {
case msg := <-urgent:
handle(msg)
default:
}
select {
case msg := <-urgent:
handle(msg)
case msg := <-normal:
handle(msg)
case <-normalTimeout:
// Принудительно даём слово normal
msg := <-normal
handle(msg)
normalTimeout = time.After(5 * time.Second)
}
}
Простота против гибкости. Согласны с таким выбором или предпочли бы встроенный механизм?
📍 Навигация: Вакансии • Задачи • Собесы
#GoDeep
Please open Telegram to view this post
VIEW IN TELEGRAM
❤9👍5🥱3🤔1
Go на бэкенде, Python в «мозгах»
Как подружить высокопроизводительный Go-бэкенд с AI-агентами? В 2026-м это стандартная задача. Мы обновили курс «Разработка AI-агентов», сделав упор на архитектуру и интеграцию в продакшн.
Что полезного для Go-разработчика?
🔹 Архитектура системы. Асинхронное взаимодействие, очереди задач, управление состоянием агентов (`State Management`).
🔹 Экономика и ресурсы. Контроль токенов, кэширование, роутинг запросов — всё, что нужно для HighLoad AI.
🔹 Интеграция. Как встроить RAG и агентные цепочки (`LangGraph`) в существующую микросервисную архитектуру.
🔹 Надёжность. Трассировка ошибок, метрики и
Стартуй сейчас! Получи базу знаний сразу после покупки.
🎟 ПромокодAgent — скидка 10 000 ₽ (до 28 февраля).
👉 Строим архитектуру AI-сервисов
Как подружить высокопроизводительный Go-бэкенд с AI-агентами? В 2026-м это стандартная задача. Мы обновили курс «Разработка AI-агентов», сделав упор на архитектуру и интеграцию в продакшн.
Что полезного для Go-разработчика?
🔹 Архитектура системы. Асинхронное взаимодействие, очереди задач, управление состоянием агентов (`State Management`).
🔹 Экономика и ресурсы. Контроль токенов, кэширование, роутинг запросов — всё, что нужно для HighLoad AI.
🔹 Интеграция. Как встроить RAG и агентные цепочки (`LangGraph`) в существующую микросервисную архитектуру.
🔹 Надёжность. Трассировка ошибок, метрики и
runbook для восстановления.Стартуй сейчас! Получи базу знаний сразу после покупки.
🎟 Промокод
👉 Строим архитектуру AI-сервисов
🥱14🔥3
Senior Golang developer (Gamedev) — удалёнка
Junior Go-developer — от 160 000 ₽, удаленно
Senior Go Developer — 406 000 ₽, удаленно
#GoWork
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3🥱1
🔄 go-testdeep — большое обновление
Вышел релиз go-testdeep v1.15.0 — одной из библиотек для глубокого сравнения данных в тестах на Go. И в этот раз изменений особенно много.
Главное: библиотека теперь без зависимостей
go-testdeep стал полностью dependency-free. Авторы встроили go-spew напрямую. Меньше go.sum, меньше проблем с совместимостью.
Новые операторы
List — простая и лёгкая альтернатива массивов и слайсов для сравнения в строгом порядке:
Sort — сортирует слайс перед сравнением. Поддерживает сложные ключи, вложенные поля и даже использование внутри JSON-оператора:
Sorted — просто проверяет, что слайс уже отсортирован:
Must, Must2, Must3 — меньше бойлерплейта
Раньше нужно было писать две строки на обработку ошибки. Теперь одну:
Если вы пишете тесты на Go и ещё не пробовали
➡️ Репозиторий
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека Go-разработчика
#GoLive
Вышел релиз go-testdeep v1.15.0 — одной из библиотек для глубокого сравнения данных в тестах на Go. И в этот раз изменений особенно много.
Главное: библиотека теперь без зависимостей
go-testdeep стал полностью dependency-free. Авторы встроили go-spew напрямую. Меньше go.sum, меньше проблем с совместимостью.
Новые операторы
List — простая и лёгкая альтернатива массивов и слайсов для сравнения в строгом порядке:
td.Cmp(t, []int{1, 9, 5}, td.List(1, 9, 5))Sort — сортирует слайс перед сравнением. Поддерживает сложные ключи, вложенные поля и даже использование внутри JSON-оператора:
td.Cmp(t, got, td.Sort("-props[priority]", []A{p34, p23, p12}))Sorted — просто проверяет, что слайс уже отсортирован:
td.Cmp(t, aSlice, td.Sorted())
td.Cmp(t, aStructSlice, td.Sorted("-FieldName")) // по убыванию
Must, Must2, Must3 — меньше бойлерплейта
Раньше нужно было писать две строки на обработку ошибки. Теперь одну:
// было
val, err := myfunction()
td.Require(t).CmpNoError(err)
// стало
val := td.Must(myfunction())
Если вы пишете тесты на Go и ещё не пробовали
go-testdeep — самое время. 📍 Навигация: Вакансии • Задачи • Собесы
#GoLive
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
🧑💻 Контекст + канал = контролируемая отмена
Сегодня разбираем, как контекст решает одну из самых частых проблем в конкурентном коде — горутины, которые продолжают работать, когда их результат уже никому не нужен.
Вместо того чтобы ждать только данных из канала, горутина одновременно слушает сигнал отмены из контекста. Как только кто-то вызывает
Это работает на любой глубине вложенности: отменили корневой контекст — сигнал получат все дочерние.
Реальный пример: HTTP-запрос с отменой
Если сервер не ответил за 3 секунды — запрос автоматически отменяется. Никаких висящих горутин.
Context или просто close(ch)
• Используйте
• Используйте
• Они не конкурируют — часто используются вместе: канал несёт данные, контекст несёт намерение остановиться.
Главные правила:
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека Go-разработчика
#GoDeep
Сегодня разбираем, как контекст решает одну из самых частых проблем в конкурентном коде — горутины, которые продолжают работать, когда их результат уже никому не нужен.
Вместо того чтобы ждать только данных из канала, горутина одновременно слушает сигнал отмены из контекста. Как только кто-то вызывает
cancel() или истекает таймаут — ctx.Done() закрывается, и все горутины, которые его слушают, корректно завершаются. Это работает на любой глубине вложенности: отменили корневой контекст — сигнал получат все дочерние.
Реальный пример: HTTP-запрос с отменой
func fetchData(ctx context.Context, url string) ([]byte, error) {
req, err := http.NewRequestWithContext(ctx, "GET", url, nil)
if err != nil {
return nil, err
}
resp, err := http.DefaultClient.Do(req)
if err != nil {
return nil, err // ctx.Err() если отменили
}
defer resp.Body.Close()
return io.ReadAll(resp.Body)
}
// Вызов с таймаутом:
ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
defer cancel() // всегда defer cancel()!
data, err := fetchData(ctx, "https://api.example.com/data")Если сервер не ответил за 3 секунды — запрос автоматически отменяется. Никаких висящих горутин.
Context или просто close(ch)
• Используйте
close(ch) когда хотите сигнализировать, что данные закончились — один продюсер завершил работу, консюмеры это видят.• Используйте
context когда нужна отмена извне — пришёл сигнал остановиться, истёк таймаут, пользователь нажал cancel. Контекст распространяется вниз по дереву вызовов сам.• Они не конкурируют — часто используются вместе: канал несёт данные, контекст несёт намерение остановиться.
Главные правила:
defer cancel() сразу после создания контекста — без исключений. Передавайте ctx первым аргументом в функцию. Не кладите context внутрь структур, это спорно, но большинство стайлгайдов против. Проверяйте ctx.Err() после долгих операций.📍 Навигация: Вакансии • Задачи • Собесы
#GoDeep
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13
Go 1.26, привёз полностью переписанный
go fix. Разбираемся, что изменилось.go fix — это статический анализатор + автоматический рефакторинг. Он находит устаревшие паттерны в коде и заменяет их более современными аналогами. Без ручной правки, без регрессий.
Как запустить:
# Починить всё в проекте
go fix ./...
# Посмотреть что изменится, не применяя
go fix -diff ./...
# Список доступных анализаторов
go tool fix help
# Документация по конкретному
go tool fix help forvar
# Запустить только один анализатор
go fix -minmax ./...
# Запустить все, кроме одного
go fix -any=false ./...
Иногда одно исправление открывает возможность для второго. Например, замена конкатенации строк в цикле на
strings.Builder может затем подсветить, что WriteString(fmt.Sprintf(...)) лучше заменить на fmt.Fprintf. Поэтому рекомендуют запускать go fix ./... дважды.В Go 1.26
go fix и go vet унифицированы: оба работают на одном фреймворке статического анализа. Разница только в критериях: vet ищет ошибки и репортит их, fix генерирует безопасные правки и применяет их.Команда Go строит «самообслуживаемую» модель: авторы библиотек смогут поставлять анализаторы вместе со своим кодом, а пользователи — применять их через
go fix без необходимости ждать обновлений.📍 Навигация: Вакансии • Задачи • Собесы
#GoToProduction
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥22👍5❤3
В Go есть три тесно связанных понятия и их обозначают аббревиатурой GMP. Вообще программисты любят аббревиатуры, например, SOLID, DRY, KISS.
Но что значит GMP в контексте Go? Может быть Горутина Материнской Платы? Скорее всего нет. Попробуйте дать ответ сами, прежде чем смотреть ответ.
📍 Навигация: Вакансии • Задачи • Собесы
#ReadySetGo
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱7
Как интегрировать ИИ в микросервисы и не положить прод
Go любят за скорость и предсказуемость. LLM-агенты — это хаос, задержки и непредсказуемый расход ресурсов. Скрестить их в продакшне — та ещё боль.
Мы пересобрали курс по AI-агентам под суровые реалии 2026 года. Сместили фокус с базовых концепций на управляемый инжиниринг: как зажать агентов в жёсткие рамки лимитов, настроить роутинг и не дать им выжрать всю память и бюджет.
Что в программе для сурового бэкенда:
— продвинутый RAG: подготовка разнородных данных к промышленным нагрузкам;
— контроль состояний: time-travel, восстановление систем после сбоев и runbooks;
— экономика агентов: ограничение вычислительных ресурсов, кэширование и динамический роутинг;
— интеграции: работа агентов с legacy-интерфейсами и визуальными подтверждениями;
— безопасность: деплой с учётом изоляции доменов и требований 152-ФЗ.
До 28 февраля по промокоду
Включайтесь в акцию «3 курса по цене 1» — забирайте агентов и ещё два курса бесплатно.
Прокачать архитектуру ИИ-решений
Go любят за скорость и предсказуемость. LLM-агенты — это хаос, задержки и непредсказуемый расход ресурсов. Скрестить их в продакшне — та ещё боль.
Мы пересобрали курс по AI-агентам под суровые реалии 2026 года. Сместили фокус с базовых концепций на управляемый инжиниринг: как зажать агентов в жёсткие рамки лимитов, настроить роутинг и не дать им выжрать всю память и бюджет.
Что в программе для сурового бэкенда:
— продвинутый RAG: подготовка разнородных данных к промышленным нагрузкам;
— контроль состояний: time-travel, восстановление систем после сбоев и runbooks;
— экономика агентов: ограничение вычислительных ресурсов, кэширование и динамический роутинг;
— интеграции: работа агентов с legacy-интерфейсами и визуальными подтверждениями;
— безопасность: деплой с учётом изоляции доменов и требований 152-ФЗ.
До 28 февраля по промокоду
Agent действует скидка 10 000 рублей.Включайтесь в акцию «3 курса по цене 1» — забирайте агентов и ещё два курса бесплатно.
Прокачать архитектуру ИИ-решений
😁1🤔1🥱1
Go — один из немногих языков, где конкурентность встроена в сам язык, а не прикручена сверху через библиотеки.
Конкурентность ≠ параллелизм
Конкурентность — это структура программы, где задачи продвигаются независимо.
Параллелизм — когда задачи буквально выполняются одновременно на разных ядрах.
Go даёт инструменты конкурентности, а параллелизм — уже дело железа и планировщика.
Почему не потоки
Обычный OS-поток весит ~1 МБ памяти и дорого переключается. Тысячи потоков — и планировщик ОС уже задыхается.
Горутина стартует с ~2 КБ стека, растёт динамически, создаётся и уничтожается молниеносно. Go-рантайм мультиплексирует тысячи горутин на маленький пул OS-потоков. Запустить 100 000 горутин — норма. 100 000 потоков — трэш.
Общение вместо общей памяти
Классика с потоками — общая память + мьютексы + гонки данных. Go предлагает другой подход:
Не общайтесь через общую память — передавайте данные через общение
Канал — типизированный конвейер для передачи данных между горутинами.
Каналы хороши для передачи владения данными, пайплайнов, воркер-пулов и сигнализации. Мьютекс из
sync — для защиты счётчиков и небольших критических секций, где важна производительность.Одно слово
go — и задача живёт своей жизнью. Никакого церемониала, никакого страха.📍 Навигация: Вакансии • Задачи • Собесы
#GoDeep
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13👍5
👩💻 Гендерный разрыв в IT
Женщины в российском IT зарабатывают в среднем 99 тысяч рублей, мужчины — 156 тысяч. Разрыв в 40% выглядит тревожно, но объяснить его одной лишь дискриминацией не получится.
Где начинается реальное неравенство, а где просто статистика — разбираемся в статье 👈
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека Go-разработчика
Женщины в российском IT зарабатывают в среднем 99 тысяч рублей, мужчины — 156 тысяч. Разрыв в 40% выглядит тревожно, но объяснить его одной лишь дискриминацией не получится.
Где начинается реальное неравенство, а где просто статистика — разбираемся в статье 👈
📍 Навигация: Вакансии • Задачи • Собесы
Please open Telegram to view this post
VIEW IN TELEGRAM
😁11🤔6❤2🥱1🌚1
🐹 Высоконагруженные AI-агенты: инжиниринг вместо промпт-инжиниринга
В 2026 году AI-системы становятся частью высоконагруженной инфраструктуры. Для Go-разработчика это означает вызовы в области управления ресурсами, токенами и задержками. Наш обновлённый курс сфокусирован именно на технической стороне вопроса.
📚 В обновлённой программе:
— экономика агентов: управление затратами, кэшированием и эффективным роутингом;
— продвинутый
—
— безопасность и закон: работа с конфиденциальными данными в рамках
Материалы для подготовки уже ждут вас — начните изучение фундамента агентов прямо сейчас.
⏳ Специальные условия до 28 февраля:
— введите промокод
— участвуйте в **акции «3 курса по цене 1» — выберите два любых курса в дополнение к основному.
👉 Получить доступ к курсу и подаркам
В 2026 году AI-системы становятся частью высоконагруженной инфраструктуры. Для Go-разработчика это означает вызовы в области управления ресурсами, токенами и задержками. Наш обновлённый курс сфокусирован именно на технической стороне вопроса.
📚 В обновлённой программе:
— экономика агентов: управление затратами, кэшированием и эффективным роутингом;
— продвинутый
RAG: методы улучшения поисковых запросов в промышленной эксплуатации;—
LangGraph: построение сложных цепочек решений с контролем промежуточных состояний;— безопасность и закон: работа с конфиденциальными данными в рамках
152-ФЗ.Материалы для подготовки уже ждут вас — начните изучение фундамента агентов прямо сейчас.
⏳ Специальные условия до 28 февраля:
— введите промокод
Agent для получения скидки 10 000 рублей**; — участвуйте в **акции «3 курса по цене 1» — выберите два любых курса в дополнение к основному.
👉 Получить доступ к курсу и подаркам
😢2🥱2😁1
Вспоминаем прошедшую неделю, уже поели блины?
— TicTacToe SSH
— Фронтенд-разработчик рассказал про переход на Go
— go-testdeep v1.15.0
— Новая жизнь старой команды
— Гендерный разрыв в IT
📍 Навигация: Вакансии • Задачи • Собесы
#GoLive
Please open Telegram to view this post
VIEW IN TELEGRAM
🎉 Завтра понедельник, но выходной
А значит можно наконец:
— дочитать статью, которая висит в закладках с прошлого года
— поковырять пет-проект без угрызений совести
— или просто лежать и думать что надо бы покодить 😅
💬 Что выбираете? 👇
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека Go-разработчика
#GoTalk
А значит можно наконец:
— дочитать статью, которая висит в закладках с прошлого года
— поковырять пет-проект без угрызений совести
— или просто лежать и думать что надо бы покодить 😅
💬 Что выбираете? 👇
📍 Навигация: Вакансии • Задачи • Собесы
#GoTalk
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4