Типы возвращаемых значений перечисляются в круглых скобках после списка аргументов, а в
return передаются сами значения через запятую:func calculateStats(numbers []int) (int, int, float64) {
sum, max := 0, numbers[0]
for _, n := range numbers {
sum += n
if n > max {
max = n
}
}
avg := float64(sum) / float64(len(numbers))
return sum, max, avg
}Please open Telegram to view this post
VIEW IN TELEGRAM
🥱6
🚀 Не уверены, стоит ли переходить на зрелую ИИ-инженерию? Начните с демо-урока!
Вот-вот стартует наш курс AgentOps. Если вы сомневаетесь в формате, просто оставьте заявку и получите бесплатный демо-урок «AI-инструменты в разработке: как писать код быстрее с помощью ассистентов».
Для тех, кто готов мощно прокачать портфолио, прямо сейчас действует предложение «3 любых курса по цене 1»:
👉 Получить демо-урок и зафиксировать спецпредложение 3 в 1
Вот-вот стартует наш курс AgentOps. Если вы сомневаетесь в формате, просто оставьте заявку и получите бесплатный демо-урок «AI-инструменты в разработке: как писать код быстрее с помощью ассистентов».
Для тех, кто готов мощно прокачать портфолио, прямо сейчас действует предложение «3 любых курса по цене 1»:
— При покупке VIP-тарифа (осталось 4 места) нового потока «ИИ-агенты» вы получаете в подарок доступ к курсу «AgentOps» + ещё один любой курс Академии на выбор
— В деньгах это два топовых курса по автоматизации и контролю ИИ всего за 134.000 ₽ вместо 263.000 ₽ 🔥 А за счет третьего курса (например, можно выбрать «Математику») вы соберете мощный стек и освоите целое востребованное направление.
— Платеж можно разбить на несколько частей с помощью беспроцентной рассрочки.
👉 Получить демо-урок и зафиксировать спецпредложение 3 в 1
😁2
Пара значение и ошибка. Функция возвращает результат и
error, который вызывающий код обязан проверить. Это основа идиоматичной обработки ошибок в Go.func divide(a, b int) (int, error) {
if b == 0 {
return 0, errors.New("деление на ноль")
}
return a / b, nil
}Please open Telegram to view this post
VIEW IN TELEGRAM
😁3🥱2
⚠️ Уже завтра стартует курс AgentOps!
Мы собрали на потоке сборную из мастеров IT-рынка. Практики из BigTech научат вас контролировать и отлаживать ИИ-агентов, чтобы они работали предсказуемо и не сливали бюджет на API.
🔥 Заберите 3 курса по цене 1:
Хотите прокачать свое портфолио продакшн-кейсом, но пока сомневаетесь? Пройдите наш бесплатный демо-урок, чтобы протестировать формат перед покупкой.
👉 Забрать 3 курса по цене 1 и получить демо-урок
Мы собрали на потоке сборную из мастеров IT-рынка. Практики из BigTech научат вас контролировать и отлаживать ИИ-агентов, чтобы они работали предсказуемо и не сливали бюджет на API.
🔥 Заберите 3 курса по цене 1:
● При покупке VIP-тарифа (осталось 4 места) нового потока «Разработка ИИ-агентов» получаете в подарок курс «AgentOps» + ещё один любой курс Академии (например, «Математика для разработки AI», чтобы глубже освоить направление).
● Три курса обойдутся вам всего в 134.000 ₽ вместо 263.000 ₽.
● Доступна удобная беспроцентная рассрочка, платеж можно разбить на несколько комфортных частей.
Хотите прокачать свое портфолио продакшн-кейсом, но пока сомневаетесь? Пройдите наш бесплатный демо-урок, чтобы протестировать формат перед покупкой.
👉 Забрать 3 курса по цене 1 и получить демо-урок
return и когда он опасенЭто
return без перечисления значений при именованных возвратах. В коротких функциях он читается нормально, но в длинных мешает понять, что именно вернётся, потому что значения задаются где то выше по телу. Поэтому голый возврат держат для небольших функций.Please open Telegram to view this post
VIEW IN TELEGRAM
🌚1
ОПРОС: Ответьте на пару вопросов и получите промокод на все наши курсы! 🎁
Команда Prоglib.аcаdemy готовит к запуску новые продукты, и нам нужна ваша помощь. Мы хотим создавать обучение, которое будет решать ваши реальные карьерные задачи и бить точно в цель.
Поделитесь своим опытом и ожиданиями, чтобы мы сделали наши курсы еще полезнее именно для вас! Заполнение анкеты займет буквально 2–3 минуты, а с нас — скидка на любой наш курс!
👉 Пройти опрос в Яндекс Формах и забрать промокод
Команда Prоglib.аcаdemy готовит к запуску новые продукты, и нам нужна ваша помощь. Мы хотим создавать обучение, которое будет решать ваши реальные карьерные задачи и бить точно в цель.
Поделитесь своим опытом и ожиданиями, чтобы мы сделали наши курсы еще полезнее именно для вас! Заполнение анкеты займет буквально 2–3 минуты, а с нас — скидка на любой наш курс!
👉 Пройти опрос в Яндекс Формах и забрать промокод
Handler отличается от HandlerFuncHandler это интерфейс с одним методом ServeHTTP(ResponseWriter, *Request). HandlerFunc это тип функции, у которого метод ServeHTTP уже реализован и просто вызывает саму функцию. Он нужен как адаптер, чтобы обычную функцию можно было отдать туда, где ждут интерфейс.mux.Handle("/ping", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("pong"))
}))Please open Telegram to view this post
VIEW IN TELEGRAM
❤4
🎮 Планы на выходные: соберите ИИ-агента в нашей новой игре!
Запустили интерактивную аркаду, где вы на практике поймете, как устроены агентные системы.
Какие навыки проверите:
- Архитектура: сборка графов на LangGraph;
- Компоненты: интеграция LLM, RAG и памяти;
- Безопасность: настройка Guardrails и отладка ошибок;
- Стейт: логика на сложных развилках.
Бонус: Больше баллов — выше скидка на обучение!
Наш новый поток стартует 14 июля. При покупке курса вы забираете еще 2 любых курса Академии в подарок!
Протестируйте свою инженерную логику и заберите максимальную скидку на обучение.
👉 Сыграть в аркаду и выбить скидку
Запустили интерактивную аркаду, где вы на практике поймете, как устроены агентные системы.
Юзеры бомбят в чате, тикеты горят, вам нужно спасать прод 🤓. Выстраивайте граф агента, подключайте узлы (RAG, CRM, Guardrails) и принимайте решения на развилках, чтобы бот не сливал данные.
Какие навыки проверите:
- Архитектура: сборка графов на LangGraph;
- Компоненты: интеграция LLM, RAG и памяти;
- Безопасность: настройка Guardrails и отладка ошибок;
- Стейт: логика на сложных развилках.
Бонус: Больше баллов — выше скидка на обучение!
Наш новый поток стартует 14 июля. При покупке курса вы забираете еще 2 любых курса Академии в подарок!
Протестируйте свою инженерную логику и заберите максимальную скидку на обучение.
👉 Сыграть в аркаду и выбить скидку
iota начинает с нуля в начале блока const и увеличивается на единицу для каждой новой строки. После присвоения значения переменной, можно не указывать iota снова для следующих переменных, и Go самостоятельно применит инкремент.const (
A = iota
B
C
D
)
// A = 0, B = 1, C = 2, D = 3
Важно помнить, что
iota применяется только внутри блока const. Если создать второй блок const, то счетчик снова начинает с нуля. Каждый блок независим.Please open Telegram to view this post
VIEW IN TELEGRAM
🎬 Как ИИ ускоряет разработку и где ломаются архитектуры
Мы провели открытый вебинар, где разобрали реальные боли проектирования автономных систем. Ольга Лукьянова на практическом кейсе показала, как использовать ИИ-ассистентов для реальных задач. Вы просили запись встречи — она уже в открытом доступе!
Что внутри:
— Как с помощью ИИ быстрее разбираться в незнакомом коде и готовить пулл-реквесты;
— Критерии выбора между одним агентом и мультиагентной системой;
— Разбор популярных архитектурных ошибок и ограничений современных ИИ;
— Практические рекомендации по проектированию и внедрению облачных агентов.
👉 Посмотреть полную запись можно тут:
● VK
● YouTube
🚀 Хотите пойти дальше открытого вебинара? Если вы готовы перейти от простых промптов к проектированию надежных, отказоустойчивых ИИ-систем, которые не сливают бюджет компании на API, приходите на курс AgentOps. Поток уже стартовал, но двери еще приоткрыты!
👉 Успеть на курс AgentOps
Мы провели открытый вебинар, где разобрали реальные боли проектирования автономных систем. Ольга Лукьянова на практическом кейсе показала, как использовать ИИ-ассистентов для реальных задач. Вы просили запись встречи — она уже в открытом доступе!
Что внутри:
— Как с помощью ИИ быстрее разбираться в незнакомом коде и готовить пулл-реквесты;
— Критерии выбора между одним агентом и мультиагентной системой;
— Разбор популярных архитектурных ошибок и ограничений современных ИИ;
— Практические рекомендации по проектированию и внедрению облачных агентов.
👉 Посмотреть полную запись можно тут:
● VK
● YouTube
🚀 Хотите пойти дальше открытого вебинара? Если вы готовы перейти от простых промптов к проектированию надежных, отказоустойчивых ИИ-систем, которые не сливают бюджет компании на API, приходите на курс AgentOps. Поток уже стартовал, но двери еще приоткрыты!
👉 Успеть на курс AgentOps
❤1
http.ListenAndServe(":8080", nil) считается плохой практикойnil означает DefaultServeMux, глобальный роутер. В него может зарегистрировать хендлер любой импортированный пакет, например net/http/pprof делает это в init. Так наружу случайно утекают отладочные ручки. У такого сервера нет тайм аутов. Правильнее создать свой
Server и свой ServeMux.Правильный вариант:
srv := &http.Server{
Addr: ":8080",
Handler: mux,
ReadHeaderTimeout: 5 * time.Second,
ReadTimeout: 10 * time.Second,
WriteTimeout: 10 * time.Second,
IdleTimeout: 120 * time.Second,
}
log.Fatal(srv.ListenAndServe())Please open Telegram to view this post
VIEW IN TELEGRAM
Это про автоматические исправления кода — фиксеры (например,
go fix, gofmt, suggested fixes из go vet / analysis-фреймворка, или --fix в линтерах вроде golangci-lint). Гарантия говорит, что такой фикс меняет только форму кода, но не его поведение во время выполнения.Под поведением тут понимается наблюдаемая семантика: что программа возвращает, какие у неё сайд-эффекты — запись в файл, вызовы по сети, вывод, — как идёт control flow, какие ошибки и паники она порождает. То есть на тех же входных данных до и после фикса программа должна давать тот же результат и те же эффекты. Трансформация behavior-preserving, семантически нейтральная.
Пример: фиксер может переписать устаревший API на новый, переставить импорты через
goimports, отформатировать код — но не должен, скажем, изменить условие в if так, что поменяется ветвление.И тут ключевой момент — формулировка «should not», а не «will not». Это заявленное свойство по дизайну, а не строгая гарантия на все случаи. В Go, где есть интерфейсы, рефлексия, горутины и гонки, всегда найдётся пограничный кейс, где формально эквивалентная замена всё же меняет смысл. Поэтому на практике фиксы обычно делят на safe и unsafe: safe можно катить массово, unsafe применяют осознанно.
Please open Telegram to view this post
VIEW IN TELEGRAM
http.Client на каждый запросНет.
Client и его Transport безопасны для конкурентного использования и держат пул TCP соединений. Новый клиент на каждый запрос убивает keep alive, каждый вызов будет заново устанавливать соединение вместе с TLS рукопожатием. Правильно создать один клиент на приложение и задать ему тайм аут, потому что у
http.DefaultClient его нет.Please open Telegram to view this post
VIEW IN TELEGRAM
💰 Почему одним Data Scientist платят больше, чем другим?
Дело не только в знании Python и ML-библиотек. Во многих компаниях уровень специалиста оценивают по математической подготовке: теории вероятностей, статистике, линейной алгебре и математическому анализу.
Именно эти знания помогают понимать модели, решать более сложные задачи и претендовать на позиции с более высокой оплатой.
На курсе «Математика для Data Science» вы изучите разделы, которые используются в работе Data Scientist и ML Engineer.
Что вас ждёт:
🔹 40+ видеолекций и 150+ практических заданий на Python
🔹 Проверка домашних работ и обратная связь от преподавателей
🔹 Подготовка к техническим собеседованиям
🔹 Программа от преподавателей ВМК МГУ, НИУ ВШЭ и экспертов индустрии
👉 Записаться на бесплатный демо-урок
Дело не только в знании Python и ML-библиотек. Во многих компаниях уровень специалиста оценивают по математической подготовке: теории вероятностей, статистике, линейной алгебре и математическому анализу.
Именно эти знания помогают понимать модели, решать более сложные задачи и претендовать на позиции с более высокой оплатой.
На курсе «Математика для Data Science» вы изучите разделы, которые используются в работе Data Scientist и ML Engineer.
Что вас ждёт:
🔹 40+ видеолекций и 150+ практических заданий на Python
🔹 Проверка домашних работ и обратная связь от преподавателей
🔹 Подготовка к техническим собеседованиям
🔹 Программа от преподавателей ВМК МГУ, НИУ ВШЭ и экспертов индустрии
👉 Записаться на бесплатный демо-урок
bigSlice = bigSlice[:5]Нет, не обязательно. Операция
[:5] создаёт новый слайс-заголовок с длиной 5, но он по-прежнему указывает на тот же самый underlying array. Пока хотя бы один слайс ссылается на этот массив, сборщик мусора не может его освободить. То есть даже если нам нужны первые 5 байт, за спиной может «висеть» все 10 MB:Дело в том, что срез — это лишь тройка из указателя на массив, длины и ёмкости. Урезание длины меняет только заголовок и никак не влияет на память под ним. Capacity нового слайса по-прежнему указывает на конец исходного массива, поэтому GC считает его достижимым.
Чтобы отдать большой массив сборщику, нужные данные копируют в новый, компактный слайс, а ссылку на исходный обнуляют:
smallCopy := make([]byte, len(smallSlice))
copy(smallCopy, smallSlice)
bigSlice = nil
Тот же эффект короче — через
append в nil-слайс, который выделит свежий массив под реальный объём данных:smallCopy := append([]byte(nil), smallSlice...)
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
Media is too big
VIEW IN TELEGRAM
📹 Из чего на самом деле состоит ИИ-агент?
Прикрепили для вас свежую вырезку из вебинара. Внутри, что прячется под капотом агентных систем: от LLM-ядра до вызова внешних инструментов. Обсуждаем, какими бывают агенты (спойлер: далеко не только автономными) и когда какой подход использовать.
Готовы перейти от видео к практике и собрать свой первый продакшн-кейс?
Прямо сейчас у нас действует акция «3 курса по цене 1»:
Сомневаетесь, подойдет ли вам формат? Оставьте заявку и пройдите бесплатный демо-урок, чтобы протестировать платформу перед покупкой.
👉 Пройти демо-урок и забрать 3 курса по цене 1
Прикрепили для вас свежую вырезку из вебинара. Внутри, что прячется под капотом агентных систем: от LLM-ядра до вызова внешних инструментов. Обсуждаем, какими бывают агенты (спойлер: далеко не только автономными) и когда какой подход использовать.
Готовы перейти от видео к практике и собрать свой первый продакшн-кейс?
Прямо сейчас у нас действует акция «3 курса по цене 1»:
🔹 При покупке VIP-тарифа нового потока «Разработка ИИ-агентов» вы получаете в подарок хардкорный курс «AgentOps» + ещё один любой курс Академии на ваш выбор!
🔹 Ваша чистая экономия — 129 000 ₽! Два топовых курса по созданию и контролю агентов обойдутся вам всего в 134 000 ₽ вместо 263 000 ₽. Плюс третий курс бонусом (например, «Математика для AI»).
Сомневаетесь, подойдет ли вам формат? Оставьте заявку и пройдите бесплатный демо-урок, чтобы протестировать платформу перед покупкой.
👉 Пройти демо-урок и забрать 3 курса по цене 1
Через второй возвращаемый параметр при обращении к мапе — так называемый comma-ok. Обычное чтение
v := m[key] всегда вернёт значение: если ключа нет, это будет нулевое значение типа (0 для чисел, "" для строк, nil для указателей). А значит, по одному только
v нельзя понять, лежал ли там реальный ноль или ключа просто не было:m := map[string]int{"a": 0}
v := m["a"] // 0 — но ключ есть
v = m["b"] // 0 — а ключа нетФорма с двумя переменными решает это: второе значение — булев флаг, который равен
true, только если ключ действительно присутствует в мапе. Именно на него и нужно смотреть, а не на само значение:v, ok := m["a"]
if ok {
// ключ есть, v — реальное значение (даже если это 0)
}
_, ok = m["b"] // ok == false, ключа нет
Отсюда типичный идиоматичный паттерн — проверка и использование в одном
if:if v, ok := m[key]; ok {
// работаем с v
}Please open Telegram to view this post
VIEW IN TELEGRAM
Обычное
v := <-ch из закрытого канала не заблокируется и не паникует, а сразу вернёт нулевое значение типа. Поэтому по одному
v нельзя отличить «пришёл реальный ноль» от «канал закрыт и пуст — ровно как с мапой:v := <-ch // 0 — но это может быть и настоящее значение, и признак закрытия
Второй параметр решает вопрос: флаг
ok равен true, пока из канала можно прочитать отправленное значение, и становится false, когда канал закрыт и в нём не осталось буферизованных данных. Важно, что закрытый канал сначала отдаёт всё, что в него успели записать, и только потом начинает возвращать
false:v, ok := <-ch
if !ok {
// канал закрыт и пуст
}
На практике за приёмом из канала обычно стоит
range, который сам корректно завершается при закрытии — отдельная проверка ok не нужна:for v := range ch {
// выполняется, пока канал не закрыт и не пустой
}Please open Telegram to view this post
VIEW IN TELEGRAM
🤔2👍1
🔥 Как перестать слепо доверять ИИ и начать им управлять?
1–2 августа на «ИИ-выходных» вы научитесь проектировать архитектуру автономных AI-агентов и контролировать их работу.
Что будет в вашем портфолио после обучения:
— Вы выйдете с готовым профилем AI-инженера (отлично дополнит ваши LinkedIn и GitHub).
— Освоите связку Python, FastAPI, OpenAI API, Docker и PostgreSQL.
— Соберете полноценный AI-сервис под вашу личную задачу.
Для кого: junior-middle разработчики. Вы пишете на Python, работаете с Git и терминалом (с нуля не подойдет, темп очень быстрый!).
👨💻 Спикер: Алексей Жиряков (Сбер, GenAI).
Места строго ограничены!
👉 Изучить программу и занять место
1–2 августа на «ИИ-выходных» вы научитесь проектировать архитектуру автономных AI-агентов и контролировать их работу.
Что будет в вашем портфолио после обучения:
— Вы выйдете с готовым профилем AI-инженера (отлично дополнит ваши LinkedIn и GitHub).
— Освоите связку Python, FastAPI, OpenAI API, Docker и PostgreSQL.
— Соберете полноценный AI-сервис под вашу личную задачу.
Для кого: junior-middle разработчики. Вы пишете на Python, работаете с Git и терминалом (с нуля не подойдет, темп очень быстрый!).
👨💻 Спикер: Алексей Жиряков (Сбер, GenAI).
Места строго ограничены!
👉 Изучить программу и занять место
Функция
len(ch) возвращает количество элементов, которые сейчас лежат в буфере канала. Функция cap(ch) возвращает вместимость буфера, то есть сколько элементов канал может хранить, не блокируя отправителя.Пример с буферизированным каналом:
ch := make(chan int, 5)
ch <- 1
ch <- 2
fmt.Println(len(ch)) // 2
fmt.Println(cap(ch)) // 5
Для небуферизированного канала обе функции всегда дают ноль, потому что у него нет буфера, где данные могли бы задержаться.
ch := make(chan int)
fmt.Println(len(ch)) // 0
fmt.Println(cap(ch)) // 0
Значение
len(ch) это снимок состояния на конкретный момент. Пока вы читаете результат и что-то с ним делаете, другая горутина уже могла записать или забрать элемент.Please open Telegram to view this post
VIEW IN TELEGRAM
❤4