default в Go превращает select в Где это полезно:
default берёт на себя фоновые задачи и проверки состояния, пока основной поток не простаивает в блокировке.Please open Telegram to view this post
VIEW IN TELEGRAM
👍3❤1
notifyList содержит два счётчика: wait (
При вызове Signal() (
Такой подход гарантирует строгий
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
По умолчанию максимальный размер стека горутины —
runtime/debug.SetMaxStack или просто import "runtime/debug"
debug.SetMaxStack(512 * 1024 * 1024) // установить лимит 512 МБ
Если горутина превысит этот лимит, то будет
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7
Когда программа хочет передать объект по сети или сохранить его на диск, она не может отправить его как есть, ей нужно превратить его в
Чаще всего это нужно в веб-приложениях и распределённых системах, где данные постоянно путешествуют между сервисами.
Берём структуру и превращаем её в JSON:
type User struct {
Name string
Age int
}
user := User{Name: "Alice", Age: 30}
jsonBytes, _ := json.Marshal(user)
// {"Name":"Alice","Age":30}Обратно из JSON в структуру:
var user User
json.Unmarshal(jsonBytes, &user)
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9
Удаление с сохранением порядка (O(n))
Используем
append для объединения частей слайса:slice := []int{1, 2, 3, 4, 5}
newSlice := append(slice[:2], slice[3:]...) // [1, 2, 4, 5]Быстрое удаление без сохранения порядка (O(1))
Меняем удаляемый элемент на последний:
slice := []int{10, 20, 30, 40, 50}
slice[1] = slice[4] // [10, 50, 30, 40, 50]
newSlice := slice[:4] // [10, 50, 30, 40]Использовать, когда нужна максимальная производительность и порядок не важен
Удаление с краёв слайса
Для первого элемента:
newSlice := slice[1:]
Для последнего элемента:
newSlice := slice[:len(slice)-1]
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4👍3👾2
Дело в том, что строки как ключи контекста создают проблему
userID, они будут обращаться к одному и Пустая структура решает это просто. Когда определяется
type userContextKey struct{} в одном пакете и type userContextKey struct{} в другом, это два Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
time.After создает таймер, который остается в памяти до истечения времени. Если вызывать это в цикле часто, таймеры накапливаются:for {
select {
case event := <-ch:
handle(event)
case <-time.After(15 * time.Minute):
fmt.Println("timeout")
}
}При большом потоке событий каждый цикл создает новый таймер на 15 минут, и они все висят в памяти одновременно. Это утечка.
Решение — использовать
time.NewTimer и явно его останавливать:timer := time.NewTimer(15 * time.Minute)
select {
case event := <-ch:
handle(event)
if !timer.Stop() {
<-timer.C
}
case <-timer.C:
fmt.Println("timeout")
}
timer.Stop() освобождает ресурсы.Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🤔2❤1
Когда вы используете type switch и ловите случай с nil, переменная
Вот это не сработает:
var x any
var y error
switch t := x.(type) {
case nil:
y = t // Ошибка компиляции
}
Компилятор выругается, что
any не может быть присвоен error, потому что any не имеет метода Error. Это подтверждает, что t внутри case nil имеет тип any, а не что-то другое.Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5
☝️ Уже сегодня: ИИ-агенты в продакшене — инженерный подход к интеграции LLM
Индустрия активно обсуждает потенциал нейросетей, способных автоматизировать бизнес-процессы и заменить целые отделы. Однако реальное внедрение агентов в
Сегодня в 19:00 МСК в рамках нашего курса «Разработка AI-агентов» мы проведём открытый вебинар «ИИ-агенты в продакшене: от хайпа к деньгам». Спикер — Полина Полунина, руководитель AI-направления в Альфа-Банке. Будем говорить о нейросетях с позиции жёсткой инженерии.
Разберём три реальных кейса из сурового банковского энтерпрайза, напишем и запустим агента прямо в эфире, честно обсудим грабли, на которые наступает бизнес при интеграции
Тем, кто придёт на эфир, дадим промокод AGENTS на скидку 10 000 ₽ на любой тариф курса.
👉 Занять место на вебинаре
Индустрия активно обсуждает потенциал нейросетей, способных автоматизировать бизнес-процессы и заменить целые отделы. Однако реальное внедрение агентов в
production вскрывает серьёзные проблемы: разработчикам приходится бороться с непредсказуемыми галлюцинациями моделей, нестабильными API и сложной интеграцией в существующую архитектуру.Сегодня в 19:00 МСК в рамках нашего курса «Разработка AI-агентов» мы проведём открытый вебинар «ИИ-агенты в продакшене: от хайпа к деньгам». Спикер — Полина Полунина, руководитель AI-направления в Альфа-Банке. Будем говорить о нейросетях с позиции жёсткой инженерии.
Разберём три реальных кейса из сурового банковского энтерпрайза, напишем и запустим агента прямо в эфире, честно обсудим грабли, на которые наступает бизнес при интеграции
LLM.Тем, кто придёт на эфир, дадим промокод AGENTS на скидку 10 000 ₽ на любой тариф курса.
👉 Занять место на вебинаре
😁2
⏳ Часовая готовность: создаём ИИ-агента в прямом эфире
В 19:00 МСК в рамках нашего курса «Разработка AI-агентов» стартует вебинар «ИИ-агенты в продакшене: от хайпа к деньгам». Спикер — Полина Полунина, руководитель AI-направления в Альфа-Банке.
Будет live-демо работающего агента, реальные метрики из корпоративной среды и честный разбор архитектурных граблей — без воды и «успешного успеха».
Всем зрителям эфира дадим эксклюзивный промокод AGENTS на скидку 10 000 ₽ на любой тариф курса.
👉 Занять место на вебинаре
В 19:00 МСК в рамках нашего курса «Разработка AI-агентов» стартует вебинар «ИИ-агенты в продакшене: от хайпа к деньгам». Спикер — Полина Полунина, руководитель AI-направления в Альфа-Банке.
Будет live-демо работающего агента, реальные метрики из корпоративной среды и честный разбор архитектурных граблей — без воды и «успешного успеха».
Всем зрителям эфира дадим эксклюзивный промокод AGENTS на скидку 10 000 ₽ на любой тариф курса.
👉 Занять место на вебинаре
context.AfterFunc планирует выполнение функции после завершения ctx, cancel := context.WithTimeout(parentCtx, 5*time.Second)
defer cancel()
context.AfterFunc(ctx, func() {
fmt.Println("Cleanup after context is done")
})
Типичные сценарии — очистка ресурсов, логирование, завершение фоновых операций.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
context.WithoutCancel нужен, когда у вас есть операция, которая обязана завершиться независимо от того, Типичная проблема без него:
func handleRequest(ctx context.Context) {
doWork(ctx)
saveAuditLog(ctx) // ctx уже отменён — лог не запишется!
}Когда клиент
ctx отменяется, и все операции на нём падают с context.Canceled. Но некоторые вещи отменять нельзя.Вот так это можно обойти:
func handleRequest(ctx context.Context) {
doWork(ctx)
safeCtx := context.WithoutCancel(ctx)
saveAuditLog(safeCtx) // выполнится в любом случае
}WithoutCancel создаёт копию контекста, которая наследует values и deadline, но игнорирует отмену родителя.Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Функция выполнится
ctx, cancel := context.WithCancel(context.Background())
cancel() // уже отменён
context.AfterFunc(ctx, func() {
fmt.Println("Runs immediately")
})
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Короткий ответ —
type Data struct {
Field1 int
Field2 int
mu sync.Mutex
}
// горутина 1
d.mu.Lock()
d.Field1 = i
d.mu.Unlock()
// горутина 2
d.mu.Lock()
d.Field2 = i
d.mu.Unlock()Мьютекс гарантирует, что в любой момент только одна горутина имеет
Обойтись без мьютекса можно только если поля
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔8❤1😢1🌚1
Самый востребованный навык в ИТ в 2026-м — навык создания ИИ-агентов
Мы полностью переработали курс «Разработка AI-агентов» под реалии 2026 года. Никакой долгой теории — с самого начала пишем код. Обучать и делиться набитыми шишками будут эксперты-практики из Газпромбанка, Альфа-Банка и других бигтехов.
В программе:
— архитектура автономных систем с тестированием, ReAct-циклами и контролем токенов;
— практическая работа с актуальными фреймворками LangGraph, AutoGen, MCP и CrewAI;
— настройка продвинутого RAG для парсинга документов и точного поиска;
— внедрение решений с учётом действующего законодательства (152-ФЗ);
— дипломная работа, за основу которой можно взять свой рабочий проект или задачу, которую предложим мы.
Эксперты поделятся инсайтами из реального продакшна — тем, о чём вам никогда не расскажет ни одна нейросеть.
Ах да, чуть не забыли! Дарим промокодAGENTSWEB на скидку 10 000 рублей и два курса сверху при покупке до 15 марта 🎁
→ Стать AI-инженером
Мы полностью переработали курс «Разработка AI-агентов» под реалии 2026 года. Никакой долгой теории — с самого начала пишем код. Обучать и делиться набитыми шишками будут эксперты-практики из Газпромбанка, Альфа-Банка и других бигтехов.
В программе:
— архитектура автономных систем с тестированием, ReAct-циклами и контролем токенов;
— практическая работа с актуальными фреймворками LangGraph, AutoGen, MCP и CrewAI;
— настройка продвинутого RAG для парсинга документов и точного поиска;
— внедрение решений с учётом действующего законодательства (152-ФЗ);
— дипломная работа, за основу которой можно взять свой рабочий проект или задачу, которую предложим мы.
Эксперты поделятся инсайтами из реального продакшна — тем, о чём вам никогда не расскажет ни одна нейросеть.
Запись первого открытого вебинара, на котором мы вместе с руководителем AI-направления в Альфа-Банке Полиной Полуниной пилили агента в прямом эфире.
Ах да, чуть не забыли! Дарим промокод
→ Стать AI-инженером
😁2
AfterFunc возвращает
stop := context.AfterFunc(ctx, func() {
// cleanup
})
if stopped := stop(); stopped {
fmt.Println("Callback cancelled before execution")
}stop() возвращает true — функция остановлена до stop() возвращает false — функция уже Please open Telegram to view this post
VIEW IN TELEGRAM
👍3❤1
time.Sleep(d) — усыпляет горутину на runtime.Gosched() — временно приостанавливает текущую горутину и передаёт
runtime.Goexit() — завершает горутину Блокировка на канале — горутина ждёт, пока кто-то не отправит или не прочитает данные. Естественная
sync.Mutex — вызов Lock() блокирует горутину, пока context.Context — горутина ctx.Done() и останавливается, когда контекст отменяется или истекает таймаут. Please open Telegram to view this post
VIEW IN TELEGRAM
👏4😁2😢1
Оцените их по шкале 🔥,❤️,👍,😢, 🥱,
где 🔥 — это супер, а 🥱 — это скучно.
Также приветствуется фидбек в комментах.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤11🔥10👍7
unique.Handle[T] — это Handle. Это позволяет сравнивать значения через == вместо reflect.DeepEqual или побайтового сравнения.import "unique"
h1 := unique.Make("hello")
h2 := unique.Make("hello")
fmt.Println(h1 == h2) // true — один и тот же указатель внутри
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9
Кажется, мы окончательно перешли от игрушек к суровому AgentOps
Приглашаем на наш обновлённый курс по разработке ИИ-агентов. Никакой воды про «будущее нейросетей», только инженерный подход.
На курсе мы:
— пошагово строим готовые системы на
— настраиваем кэширование и роутинг, чтобы бот не сожрал токены;
— разбираемся со стейтом, учимся дебажить через time-travel и прикручиваем human-in-the-loop;
— выводим RAG в прод так, чтобы безопасники не завернули архитектуру из-за 152-ФЗ.
В пекло скучные лекции про общую инфраструктуру — сразу фокусируемся на агентных фреймворках и написании кода. Занятия ведут бывалые лиды из Газпромбанка и Альфы, набившие шишки на реальных задачах.
Сегодня последний день, когда можно забрать курс по старым ценам. Базовый тариф сейчас стоит 49 000 ₽ (вместо 62 990 ₽), продвинутый трек — 99 000 ₽ (вместо 124 990 ₽). Если не хочется отдавать всю сумму сразу, есть рассрочка. Торопитесь — на потоке осталось всего 5 мест!
→ Зафиксировать цену и перейти к сборке своих агентов
Приглашаем на наш обновлённый курс по разработке ИИ-агентов. Никакой воды про «будущее нейросетей», только инженерный подход.
На курсе мы:
— пошагово строим готовые системы на
LangGraph, CrewAI и MCP;— настраиваем кэширование и роутинг, чтобы бот не сожрал токены;
— разбираемся со стейтом, учимся дебажить через time-travel и прикручиваем human-in-the-loop;
— выводим RAG в прод так, чтобы безопасники не завернули архитектуру из-за 152-ФЗ.
В пекло скучные лекции про общую инфраструктуру — сразу фокусируемся на агентных фреймворках и написании кода. Занятия ведут бывалые лиды из Газпромбанка и Альфы, набившие шишки на реальных задачах.
Кстати, на днях мы пилили агента в прямом эфире, если пропустили — есть запись вебинара.
Сегодня последний день, когда можно забрать курс по старым ценам. Базовый тариф сейчас стоит 49 000 ₽ (вместо 62 990 ₽), продвинутый трек — 99 000 ₽ (вместо 124 990 ₽). Если не хочется отдавать всю сумму сразу, есть рассрочка. Торопитесь — на потоке осталось всего 5 мест!
→ Зафиксировать цену и перейти к сборке своих агентов
❤2😁1
GOPATH просто брал тот код, что уже лежал на
Go модули решают эту проблему в корне: каждая зависимость зафиксирована с конкретной
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3👾1