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
Когда результат зависит от
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
❤6🥱1
Buffer.Peek(n), если в буфере меньше n байтBuffer.Peek возвращает срез доступных байт даже если их меньше n. Ошибки при этом нет. Поведение аналогично bufio.Reader.Peek, но там при нехватке байт возвращается io.ErrUnexpectedEOF — это распространённое заблуждение при переносе привычек из bufio.Please open Telegram to view this post
VIEW IN TELEGRAM
Решаешь задачи, смотришь курсы, а работы всё нет? 🤨
Потому что знать Go и уметь пройти собес - это разные вещи. Компании не платят за знания. Они платят за тех, кто умеет себя продать и решать задачи в стрессовых условиях.
❤️ Меня зовут Дима Урин, и я веду разработчиков до оффера на 300-400к в топ-компании. Лично от первой задачи до закрытия испытательного срока.
Хочешь так же?💰
Приходи на ведение
Приходи на ведение
Реклама. Урин Дмитрий Алексеевич, ИНН 760404084194. Erid 2Vtzqvb278C
Потому что знать Go и уметь пройти собес - это разные вещи. Компании не платят за знания. Они платят за тех, кто умеет себя продать и решать задачи в стрессовых условиях.
Хочешь так же?
Приходи на ведение
Приходи на ведение
Реклама. Урин Дмитрий Алексеевич, ИНН 760404084194. Erid 2Vtzqvb278C
Please open Telegram to view this post
VIEW IN TELEGRAM
😁5🔥3❤2🥱1🌚1
httputil.NewSingleHostReverseProxy и зачем он нуженNewSingleHostReverseProxy создаёт обратный прокси, который перенаправляет входящие HTTP-запросы на один заданный сервер. Вы передаёте функции целевой URL, а она возвращает http.Handler, готовый к использованию.Типичный сценарий это API-шлюз или балансировщик нагрузки перед сервисом. Вместо того чтобы писать логику проксирования вручную, можно получить готовый обработчик в несколько строк:
target, _ := url.Parse("http://backend-service:8080")
proxy := httputil.NewSingleHostReverseProxy(target)
http.ListenAndServe(":80", proxy)Please open Telegram to view this post
VIEW IN TELEGRAM
👍1