До версии 1.20 ошибки обрабатывались
errors.Join.err = errors.Join(function1(), function2())
if err != nil {
fmt.Println(err)
// выведет все ошибки через \n
errors.Join возвращает nil, если все переданные ошибки равны nil. Иначе он возвращает составную ошибку, которую можно раскрыть через errors.Unwrap.Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤3
FieldsFunc пропускает любое количество подряд идущих разделителей и не создаёт пустых элементов между ними — в отличие от Split, который создаёт пустую строку на каждый лишний разделитель:data := []byte("foo,,bar,,,baz")
parts := bytes.FieldsFunc(data, func(r rune) bool {
return r == ','
})
// ["foo" "bar" "baz"]
bytes.Split([]byte("foo,,bar"), []byte(","))
// ["foo" "" "bar"] — пустой элемент между двумя запятымиPlease open Telegram to view this post
VIEW IN TELEGRAM
🔥11
slices.Compact удаляет подряд идущие дубликаты, то есть оставляет только первый элемент из каждой группы одинаковых соседних значений.s := []int{1, 1, 2, 3, 3, 3, 4, 1, 1}
s = slices.Compact(s)
// [1 2 3 4 1]Compact работает in-place и возвращает подсрез того же массива — лишние элементы в хвосте не обнуляются, просто укорачивается длина.Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
This media is not supported in your browser
VIEW IN TELEGRAM
Тема: Почему AI-продукты на базе LLM ломаются и как сделать, чтобы работало.
В кружке выше Эмиль Сатаев рассказал, какие именно проблемы с LLM в проде будем разбирать.
Что в программе:
- Разберем реальные кейсы стартапов и ограничения LLM.
- Обсудим рабочие архитектуры: RAG, human-in-the-loop, контроль качества.
- Ответим на ваши вопросы и разберем кейсы участников.
🎁 Бонусы: в конце вебинара подарим промокод на скидку 10.000 ₽ на курсы и разыграем подписки на полезные AI-сервисы.
👉 Зарегистрироваться на вебинар
Please open Telegram to view this post
VIEW IN TELEGRAM
Оцените их по шкале 🔥,❤️,👍,😢, 🥱,
где 🔥 — это супер, а 🥱 — это скучно.
Также приветствуется фидбек в комментариях.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7🔥6👍3🥱1👾1
slices.BinarySearchСрез должен быть отсортирован по возрастанию — иначе результат непредсказуем.
names := []string{"Alice", "Bob", "Vera"}
n, found := slices.BinarySearch(names, "Bill")
// n=1, found=false — позиция, куда нужно вставить "Bill"
n, found = slices.BinarySearch(names, "Vera")
// n=2, found=truePlease open Telegram to view this post
VIEW IN TELEGRAM
👍4😁2
Теперь в качестве аргумента можно передавать не только тип, но и
p := new(42) // *p == 42
Если аргумент
expr имеет тип T, то new(expr) выделяет переменную типа T, инициализирует её значением expr и возвращает указатель типа *T.Please open Telegram to view this post
VIEW IN TELEGRAM
😁3👍1
🔥 Знакомьтесь с экспертом Proglib.academy: Эмиль Сатаев
Эмиль — эксперт с 8-летним опытом в разработке, который специализируется на внедрении LLM и агентных подходов в реальные коммерческие сервисы. Он точно знает, как проектировать архитектуру так, чтобы ИИ-функции работали стабильно в связке с внешними системами.
🏃♀️ Уже 14 мая Эмиль проведет открытый вебинар!
Обсудим самую «больную» тему: «Почему AI-продукты на базе LLM ломаются и как сделать, чтобы работало».
🗓 Когда: 14 мая в 19:00 (Мск)
Почему Эмиля стоит послушать:
🟣 8+ лет в разработке (Backend и Frontend)
🟣 Международный исследовательский опыт
🟣 Преподаватель-практик
🟣 Мастер интеграции AI в Backend
🔗 Зарегистрироваться на вебинар
Эмиль — эксперт с 8-летним опытом в разработке, который специализируется на внедрении LLM и агентных подходов в реальные коммерческие сервисы. Он точно знает, как проектировать архитектуру так, чтобы ИИ-функции работали стабильно в связке с внешними системами.
Обсудим самую «больную» тему: «Почему AI-продукты на базе LLM ломаются и как сделать, чтобы работало».
🗓 Когда: 14 мая в 19:00 (Мск)
Почему Эмиля стоит послушать:
Прошел путь от фулстека до Backend Platform Developer в SMIT.Studio.
Работал исследователем в Институте ИИ НИУ ВШЭ и в Национальном университете Сингапура (NUS).
Ведет семинары в НИУ ВШЭ, в том числе по проектированию и разработке агентских систем.
Его главная суперсила — умение правильно встраивать LLM через API, выстраивать workflow и агентную логику в сложных распределенных системах.
🔗 Зарегистрироваться на вебинар
Please open Telegram to view this post
VIEW IN TELEGRAM
😁1
context в юнит-тестахt.Context() — основной способ (Go 1.24+):func TestFetch(t *testing.T) {
result, err := Fetch(t.Context(), "https://example.com")
// ...
}Контекст автоматически отменяется при завершении теста, в том числе по
go test -timeout. Не нужен ни defer cancel(), ни ручной WithTimeout.Явный таймаут — когда тестируете временно́е поведение:
ctx, cancel := context.WithTimeout(t.Context(), 500*time.Millisecond)
defer cancel()
Базовый контекст —
t.Context(), не context.Background(). Так контекст остаётся привязан к жизненному циклу теста.Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
go fix в Go 1.26go fix была полностью переписана с нуля. Вот ключевые изменения:Старая реализация
cmd/fix была удалена, а go fix перестроена по модели go vet — обе команды теперь работают поверх одного и того же фреймворка. Разница между ними в том, что go vet сообщает о диагностике, а go fix применяет предложенные исправления.Команда Go разработала десятки анализаторов для выявления возможностей модернизации кода. Они предоставляют надёжный способ обновить кодовую базу до актуальных идиом и API стандартной библиотеки.
Все старые фиксеры из оригинальной
go fix, которые к этому моменту были устаревшими, были полностью удалены.Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5😁2❤1
Вы работаете с монолитом, который растёт и замедляет команду, но переход к микросервисам кажется рискованным? В большинстве случаев проблема не в архитектуре, а в неверных решениях на этапе разделения.
📆 Приглашаем вас на открытое онлайн-занятие «Грамотная декомпозиция монолита (когда микросервисы не нужны)», которое проходит в преддверии старта курса «Микросервисы на Go». Вы увидите, как проходит обучение, и разберёте реальные подходы вместе с преподавателем.
На занятии вы узнаете, как определить готовность проекта к разделению, какие признаки указывают на необходимость изменений и как избежать появления распределённого монолита. Разберёте работу с событиями, ошибки с общими библиотеками и подходы к выделению первого сервиса без риска для системы. Можно задать вопросы и обсудить свою ситуацию.
🚀 Занятие пройдёт 19 мая в 20:00 по московскому времени. Участие бесплатное.
Зарегистрируйтесь заранее, чтобы не пропустить: https://clc.to/ulHozw
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
📆 Приглашаем вас на открытое онлайн-занятие «Грамотная декомпозиция монолита (когда микросервисы не нужны)», которое проходит в преддверии старта курса «Микросервисы на Go». Вы увидите, как проходит обучение, и разберёте реальные подходы вместе с преподавателем.
На занятии вы узнаете, как определить готовность проекта к разделению, какие признаки указывают на необходимость изменений и как избежать появления распределённого монолита. Разберёте работу с событиями, ошибки с общими библиотеками и подходы к выделению первого сервиса без риска для системы. Можно задать вопросы и обсудить свою ситуацию.
🚀 Занятие пройдёт 19 мая в 20:00 по московскому времени. Участие бесплатное.
Зарегистрируйтесь заранее, чтобы не пропустить: https://clc.to/ulHozw
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Когда результат зависит от
OnceValue кэширует навсегда и для изменяемых данных нужен другой механизм: atomic, mutex, канал.
Please open Telegram to view this post
VIEW IN TELEGRAM
В Go строки
s[10:20] данные Чтобы экономить память, используйте
strings.Clone(substr)или string([]byte(substr)) для создания независимой Копируйте строки только если подстрока действительно живёт значительно дольше родителя — для кратковременной обработки, например, внутри обработчика запроса, срез без копирования эффективнее, так как выделение и копирование дороже, чем удержание лишней памяти.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
Код 200 говорит клиенту: «Всё прошло штатно, держи результат». Если вместо результата внутри тела прячется ошибка, то клиент вынужден парсить ответ, чтобы понять, что запрос на самом деле провалился. Это ломает саму идею HTTP-контракта.
Когда это всё-таки допустимо? При ошибках бизнес-логики. Например, валидация формы вернула список замечаний: сам запрос обработан корректно, просто данные не прошли проверку на уровне домена. Но даже тут стоит трижды подумать.
Для всего остального в HTTP уже есть подходящие коды — и они существуют не просто так:
🔹
400 Bad Request — клиент прислал невалидные данные 🔹
404 Not Found — ресурс не существует 🔹
500 Internal Server Error — сервер сломался и не смог обработать запрос 🔹
503 Service Unavailable — сервер на паузе: перегрузка, деплой, обслуживаниеPlease open Telegram to view this post
VIEW IN TELEGRAM
❤5