Если несколько горутин читают и пишут в один слайс
append может вызвать
Передача слайса по значению копирует только
Что делать:
•
sync.Mutex / sync.RWMutex — если нужен общий • передавать копию данных через канал, если горутина должна работать независимо
• sync.Map или разбиение на независимые диапазоны, если горутины работают с непересекающимися частями
Важный нюанс: если горутины работают со строго непересекающимися индексами и append не вызывается — гонки нет. Но доказать это на ревью сложно, поэтому явная синхронизация предпочтительнее.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
%v от %#v в fmt.Printf%v — выводит значение в формате%#v — выводит значение в type User struct {
Name string
Age int
}
u := User{"Alice", 30}
fmt.Printf("%v\n", u) // {Alice 30}
fmt.Printf("%#v\n", u) // main.User{Name:"Alice", Age:30}Please open Telegram to view this post
VIEW IN TELEGRAM
👍16
Go обращается
Доступ к элементу слайса константный по времени О(1).
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5
require фиксирует модуль и его версию. Без этой записи Go не знает, что подключать. При запуске go mod tidy строки require обновляются автоматически.require github.com/some/pkg v1.2.3
replace подменяет источник модуля. Можно указать форк, другую версию или локальный путь. Чаще всего используют при локальной разработке — когда нужно протестировать изменения в зависимости, не публикуя их. replace github.com/some/pkg => ../local/pkg
exclude запрещает использовать конкретную версию при разрешении зависимостей. Модуль не удаляется, но если что-то в дереве зависимостей попытается подтянуть именно эту версию — Go её проигнорирует и выберет другую. Применяют, когда версия содержит баг или уязвимость.exclude github.com/some/pkg v1.2.3
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤1
В Go нет встроенного ограничения на размер бинарника. Теоретический предел это ресурсы машины, на которой идёт компиляция: свободное место на диске и доступная память.
Размер бинарника растёт из-за нескольких вещей:
Статическая линковка. Go по умолчанию собирает всё в один файл — рантайм, стандартная библиотека, все зависимости. Никаких внешних
.so или .dll. Это удобно при деплое, но увеличивает размер даже у простой программы.Встроенные ресурсы. Через
//go:embed можно упаковать в бинарник статику, шаблоны, миграции. Добавили папку с фронтендом — бинарник вырос на её размер.Отладочная информация. По умолчанию Go включает в бинарник DWARF-символы и таблицы имён. Это нужно для профилировщика и стектрейсов, но добавляет вес.
Если размер важен, его можно уменьшить флагами линковщика:
go build -ldflags="-s -w" -o app .
-s убирает таблицу символов, -w отключает DWARF. Бинарник становится меньше на 20–30%, но отладка по нему будет затруднена.Дополнительно можно прогнать через
upx — утилита сжимает исполняемый файл, он распаковывается уже в памяти при запуске.Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6❤2
Anonymous Poll
33%
Да
49%
Нет
9%
Почти
9%
Отвечу в комментах
Паттерн
Можно реализовать через фасадную-прослойку: она
Переключение идёт через
Please open Telegram to view this post
VIEW IN TELEGRAM
В Go
syscall из golang.org/x/sys/unix или windows. Они предоставляют низкоуровневый интерфейс к вызовам ядра — например, можно вызвать syscall.Open, syscall.Read, syscall.Write или напрямую использовать syscall.Syscall(SYS_READ, ...), передавая номер системного вызова и аргументы.На практике прямое использование
syscall встречается редко, потому что стандартная библиотека Go уже абстрагирует большинство системных взаимодействий через пакеты os, net, io и другие. Под epoll, ptrace, seccomp, установке флагов дескрипторов или при написании системных утилит, где нужна максимальная гибкость без лишних обёрток.Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🦾 Почему ваши AI-продукты на базе LLM ломаются (и как это чинить)?
Выкатили ИИ-фичу в прод, а она галлюцинирует, падает или выдает мусор? Приглашаем на открытый вебинар, где разберем реальную боль внедрения LLM-агентов и научимся делать так, чтобы «всё работало».
🗓 Когда: 14 мая в 19:00 МСК
⏱️ Формат: 60 минут мяса + 30 минут ответов на ваши вопросы
🧑🏻💻 Кто вещает: Эмиль Сатаев — Backend Platform Developer (8+ лет в разработке). Человек, который своими руками внедряет LLM и агентные системы в реальные коммерческие сервисы.
🎁 Главный бонус для онлайна:
Только участникам прямого эфира подарим уникальный промокод на скидку 10.000 ₽ на большой курс AgentOps.
👉 Занять место на вебинаре
Выкатили ИИ-фичу в прод, а она галлюцинирует, падает или выдает мусор? Приглашаем на открытый вебинар, где разберем реальную боль внедрения LLM-агентов и научимся делать так, чтобы «всё работало».
🗓 Когда: 14 мая в 19:00 МСК
⏱️ Формат: 60 минут мяса + 30 минут ответов на ваши вопросы
🧑🏻💻 Кто вещает: Эмиль Сатаев — Backend Platform Developer (8+ лет в разработке). Человек, который своими руками внедряет LLM и агентные системы в реальные коммерческие сервисы.
🎁 Главный бонус для онлайна:
Только участникам прямого эфира подарим уникальный промокод на скидку 10.000 ₽ на большой курс AgentOps.
👉 Занять место на вебинаре
До версии 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