Представьте, что у вас есть приложение с тремя версиями: бесплатной, Pro и Enterprise. В бесплатной — базовый набор функций, в Pro — добавляем новую, а в Enterprise — ещё одну сверху.
В Go есть механизм build tags. Он позволяет управлять тем, какие файлы попадут в сборку.
Основной файл для Free версии может выглядеть так:
package main
import "fmt"
var features = []string{"A", "B"}
func main() {
for _, s := range features {
fmt.Println(s)
}
}
Два базовых функционала уже есть. Теперь создаём новый файл pro.go и добавляем туда функцию для Pro версии, но так, чтобы она включалась только при сборке с тегом pro:
//go:build pro
package main
func init() {
features = append(features, "C")
}
И для Enterprise версии можно сложить условия — пусть файл с функцией D будет собираться только если установлены оба тега pro и enterprise:
//go:build pro && enterprise
package main
func init() {
features = append(features, "D")
}
Собираем версии так:
go build -o free .
go build -o pro -tags=pro .
go build -o enterprise -tags=pro,enterprise .
Если раньше вы обходились константами или сложными if, попробуйте этот подход.
#GoDeep
Please open Telegram to view this post
VIEW IN TELEGRAM
👍26❤10⚡1👏1🤔1
🔄 Обновление httpcache до версии 1.3.0
Httpcache — это библиотека для кеширования HTTP-ответов. Она работает как слой между клиентом и сервером, чтобы хранить копии ответов и выдавать их повторно при одинаковых запросах.
В свежем релизе httpcache 1.3.0 много новых возможностей:
1. Поддержка новых кеширующих вариантов:
• MongoDB с пулом
• Hazelcast для распределённого
• NATS JetStream KV для лёгкого кеширования
• PostgreSQL с бенчмарками
• FreeCache — высокопроизводительный кеш в памяти
2. Добавлена обёртка для кэшированных данных с поддержкой gzip, brotli и snappy
3. Добавлена поддержка AES-256-GCM шифрования (SecureCache) с динамическим размером nonce
В новых версиях зона применения расширилась благодаря поддержке популярных баз данных и распределённых систем хранения.
➡️ Release notes
🐸 Библиотека Go-разработчика
#GoLive
Httpcache — это библиотека для кеширования HTTP-ответов. Она работает как слой между клиентом и сервером, чтобы хранить копии ответов и выдавать их повторно при одинаковых запросах.
В свежем релизе httpcache 1.3.0 много новых возможностей:
1. Поддержка новых кеширующих вариантов:
• MongoDB с пулом
• Hazelcast для распределённого
• NATS JetStream KV для лёгкого кеширования
• PostgreSQL с бенчмарками
• FreeCache — высокопроизводительный кеш в памяти
2. Добавлена обёртка для кэшированных данных с поддержкой gzip, brotli и snappy
3. Добавлена поддержка AES-256-GCM шифрования (SecureCache) с динамическим размером nonce
В новых версиях зона применения расширилась благодаря поддержке популярных баз данных и распределённых систем хранения.
#GoLive
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4👍4
Времена жизни и управление памятью в Rust
Borrow checker, lifetimes и владение — три кита, на которых держится безопасность Rust. На открытом вебинаре курса OTUS Rust Developer. Professional Илья Богданов объяснит, как работает управление памятью под капотом и почему Rust предотвращает целые классы ошибок ещё на этапе компиляции.
📌 19 ноября, 20:00
Времена жизни и управление памятью в Rust
— move, borrow и copy: как устроена система владения
— lifetimes и зачем нужны апострофы в коде
— borrow checker без страха и боли
— как проектировать API с правильными lifetime’ами
Вебинар бесплатный и будет полезен как начинающим, так и опытным разработчикам на Rust, а также программистам на C/C++, которые хотят понять, как создавать безопасный и эффективный код без сборщика мусора.
👉 Зарегистрироваться: https://clc.to/gwfBrA
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Borrow checker, lifetimes и владение — три кита, на которых держится безопасность Rust. На открытом вебинаре курса OTUS Rust Developer. Professional Илья Богданов объяснит, как работает управление памятью под капотом и почему Rust предотвращает целые классы ошибок ещё на этапе компиляции.
📌 19 ноября, 20:00
Времена жизни и управление памятью в Rust
— move, borrow и copy: как устроена система владения
— lifetimes и зачем нужны апострофы в коде
— borrow checker без страха и боли
— как проектировать API с правильными lifetime’ами
Вебинар бесплатный и будет полезен как начинающим, так и опытным разработчикам на Rust, а также программистам на C/C++, которые хотят понять, как создавать безопасный и эффективный код без сборщика мусора.
👉 Зарегистрироваться: https://clc.to/gwfBrA
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
😁4❤1
Важно научиться читать вакансии между строк и понимать, какие обязанности и условия действительно вас ждут. Например, «гибкий график» часто означает ненормированный рабочий день и ночные созвоны. А «карьерный рост» — это прорастить себя самому среди хаоса и авралов.
Чтобы не попасть в ловушку, стоит задавать работодателю конкретные вопросы о задачах, отпуске, оплате и культуре компании. Так можно избежать сюрпризов и выбрать действительно комфортное место работы.
Please open Telegram to view this post
VIEW IN TELEGRAM
🛠 Почему ваши горутины — это бомбы замедленного действия
Все мы это делали:
Запустил пару горутин — и вроде всё работает. Но на деле вы только что создали две бомбы.
Эти горутины не имеют ни надзора, ни обработки ошибок, ни пути к корректному завершению.
Ошибка №1: Fire-and-forget goroutines
Кажется, элегантно: не блокируем ответ, всё асинхронно.
Проблема в том, что эта горутина безответственная. Что если sendNotification упадёт в панике? Что если она зависнет навсегда? Что если сервер перезапустится? Уведомления потеряются.
Лучше вместо простого
Ошибка №2: Безграничный параллелизм
Пока пользователей немного — всё в порядке.
Но когда их 100 тысяч, начинается война за CPU, база задушена, API заблокирован.
Решение — worker pool. Ограничиваем количество горутин, получаем предсказуемую нагрузку:
или ещё проще — через errgroup:
Так код становится контролируемым, безопасным и дебажимым.
🐸 Библиотека Go-разработчика
#GoDeep
Все мы это делали:
func main() {
go doSomething()
go doSomethingElse()
time.Sleep(time.Second)
}Запустил пару горутин — и вроде всё работает. Но на деле вы только что создали две бомбы.
Эти горутины не имеют ни надзора, ни обработки ошибок, ни пути к корректному завершению.
Ошибка №1: Fire-and-forget goroutines
func handleRequest(w http.ResponseWriter, r *http.Request) {
data := processData(r.Body)
go sendNotification(data)
w.WriteHeader(http.StatusOK)
}Кажется, элегантно: не блокируем ответ, всё асинхронно.
Проблема в том, что эта горутина безответственная. Что если sendNotification упадёт в панике? Что если она зависнет навсегда? Что если сервер перезапустится? Уведомления потеряются.
Лучше вместо простого
go sendNotification(data) сделать воркер с очередью задач, который запускает ограниченное число горутин:type Worker struct {
queue chan Notification
wg sync.WaitGroup
}
func (w *Worker) Start(ctx context.Context) {
for i := 0; i < 5; i++ {
w.wg.Add(1)
go func() {
defer w.wg.Done()
for {
select {
case n, ok := <-w.queue:
if !ok {
return
}
if err := sendNotification(n); err != nil {
log.Println("Error:", err)
}
case <-ctx.Done():
return
}
}
}()
}
}
func (w *Worker) Shutdown() {
close(w.queue)
w.wg.Wait()
}Ошибка №2: Безграничный параллелизм
func processUsers(users []User) {
for _, user := range users {
go processUser(user)
}
}Пока пользователей немного — всё в порядке.
Но когда их 100 тысяч, начинается война за CPU, база задушена, API заблокирован.
Решение — worker pool. Ограничиваем количество горутин, получаем предсказуемую нагрузку:
numWorkers := runtime.NumCPU()
jobs := make(chan User)
//стартуем обработку и ждём, пока все отработают
или ещё проще — через errgroup:
g, ctx := errgroup.WithContext(context.Background())
g.SetLimit(10)
Так код становится контролируемым, безопасным и дебажимым.
#GoDeep
Please open Telegram to view this post
VIEW IN TELEGRAM
👍25❤4
В одном из российских вузов начали учить студентов программированию на кириллице. JavaScript перевели полностью: теперь вместо function — «функция», вместо if — «если», и ни одной латинской буквы в коде.
Представим себе го на кириллице:
пакет главная
включить "fmt"
функция главная() {
fmt.Напечатать("Привет, мир!")
}
Стиль лаконичен, даже в русском варианте. Только вот другая проблема — Go держится на простоте синтаксиса и мощной экосистеме инструментов, где всё, от gofmt до go mod, завязано на английский.
Локализованный синтаксис может подойти в учебных целях — помочь новичкам понять базовую структуру программы без языкового барьера. Но профессиональный мир Go построен на международных стандартах, где слово interface несёт не только смысл, но и культурный код сообщества.
💬 Напишите свой последний код на кириллице в комментах 👇
#GoTalk
Please open Telegram to view this post
VIEW IN TELEGRAM
😁38🥱14👾4😢1🌚1
В мире Go и не только merge‑конфликты — частая головная боль для разработчиков. Стандартный алгоритм слияния в Git работает построчно, что приводит к конфликтам даже в тех случаях, когда изменения не пересекаются логически.
Mergiraf — средство для синтаксически осознанного слияния, которое решает эту проблему.
Mergiraf анализирует исходный код с помощью библиотеки tree-sitter, которая строит дерево синтаксических элементов. Это позволяет инструменту понимать структуру кода и автоматически разрешать многие конфликты, которые обычный line-based merge не способен обработать.
В тестах на коде ядра Linux Mergiraf успешно автоматически решил сотни конфликтов, экономя время и нервы программистов.
#GoToProduction
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14👍6❤4
Первые страницы джоб-бордов переполнены, а фильтры показывают ненужные позиции. Булевый поиск помогает работать с логикой и находить вакансии от стартапов и компаний, которые не публикуют вакансии напрямую.
Используя простые операторы и правильные запросы, можно искать нужные вакансии по стэку, уровню и условиям, исключать стажировки и фильтровать язык описания.
Please open Telegram to view this post
VIEW IN TELEGRAM
Дана строка из символов. Требуется найти длину самой длинной подстроки, в которой все символы встречаются только один раз подряд. Иными словами — ищем максимально уникальный фрагмент строки.
Пример:
abcabcbb → 3 (abc)
bbbbb → 1 (b)
pwwkew → 3 (wke или kew)
Решение. Используем скользящее окно и мапу для отслеживания последних позиций:
func lengthOfLongestSubstring(s string) int {
m := make(map[rune]int)
maxLen, left := 0, 0
for right, ch := range s {
if idx, ok := m[ch]; ok && idx >= left {
left = idx + 1
}
m[ch] = right
if curLen := right - left + 1; curLen > maxLen {
maxLen = curLen
}
}
return maxLen
}left — старт окна, right — конец. Если символ “повторился” (уже был в окне), двигаем left — выкидываем всё до текущего повторяющегося символа.
Асимптотика: O(n), где n — длина строки.
#ReadySetGo
Please open Telegram to view this post
VIEW IN TELEGRAM
❤12👍5
📘 Хочешь в Data Science, но есть пробелы в знаниях математики?
Мы сделали экспресс-курс «Математика для Data Science», который за 2 месяца даст тебе фундамент, без которого ни одна ML-модель не взлетит 🚀
Что тебя ждёт:
🔹 живые вебинары с экспертами (НИУ ВШЭ, SberAI, Wildberries&Russ);
🔹 практика в Python, квизы и проверка заданий экспертами;
🔹 матрицы, регрессии, вероятности и статистика: всё на примерах из реальных задач;
🔹 старт — 4 декабря.
🔥 Не упусти халяву: сейчас 40% до 30 ноября
👉 Записаться на курс
Мы сделали экспресс-курс «Математика для Data Science», который за 2 месяца даст тебе фундамент, без которого ни одна ML-модель не взлетит 🚀
Что тебя ждёт:
🔹 живые вебинары с экспертами (НИУ ВШЭ, SberAI, Wildberries&Russ);
🔹 практика в Python, квизы и проверка заданий экспертами;
🔹 матрицы, регрессии, вероятности и статистика: всё на примерах из реальных задач;
🔹 старт — 4 декабря.
🔥 Не упусти халяву: сейчас 40% до 30 ноября
👉 Записаться на курс
Пакет unsafe в Go — это инструмент, который позволяет обходить систему безопасности типов языка. Он не гарантирует обратную совместимость и используется для специальных задач, таких как оптимизации и взаимодействие с Cи.
В видео подробно про функции, примеры оптимизаций и предостережения об осторожном обращении с unsafe из-за угрозы безопасности и стабильности программ.
#GoDeep
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔2🥰1
Библиотека Go-разработчика | Golang
Please open Telegram to view this post
VIEW IN TELEGRAM
😁35🔥5❤1😢1
🛠 Go + Google ADK
Google расширили свой Agent Development Kit (ADK), теперь он поддерживает Go.
ADK упрощает процесс разработки, тестирования, версионирования и развертывания AI-агентов — будь то локально или в облаке.
➡️ Источник
🐸 Библиотека Go-разработчика
#GoLive
Google расширили свой Agent Development Kit (ADK), теперь он поддерживает Go.
ADK упрощает процесс разработки, тестирования, версионирования и развертывания AI-агентов — будь то локально или в облаке.
#GoLive
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14❤4🔥4
Половина ноября позади. Вспомним что было на этой неделе.
— httpcache 1.3.0
— Возможность роста через боль
— Кто-то спрятал вакансии
— Go уже 10 лет в опен-сорсе
#GoLive
Please open Telegram to view this post
VIEW IN TELEGRAM
Anonymous Poll
52%
Структура кода в Go
8%
Монетки в лестницу выкладываем
11%
Настройка dev окружения с Anvil
21%
Делим приложение на free и pro
20%
Обновление httpcache
9%
Статья про неоднозначность слов работодателя
40%
Ошибки при работе с горутинами
20%
Русский Го
10%
Жираф для мержей
17%
Задача про максимальную уникальную подстроку
❤2🤔1
Вышло обновление Go-библиотеки для реалтайм приложений.
Centrifuge поддерживает WebSocket-соединения, pub/sub-модель обмена сообщениями, отслеживание присутствия пользователей и историю сообщений.
Что обновилось:
• Фильтрация по тегам — сервер отправляет только релевантные сообщения.
• WebSocket через HTTP/2 — каждое соединение как отдельный поток. Снижает латентность и число TCP-соединений.
• FIPS compliance — делегирование SHA-1 в Redis.
• Компактификация каналов — замена названий каналов на ID. Сокращает размер с 40-60 до 1-10 байт.
• Исправления — deadlock при отключении соединений, обновления зависимостей и метрик.
#GoLive
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14❤1
🚀 В IT ценится не перфекционизм, а движение вперёд, и если вы давно откладывали обучение — самое время начать.
❤️ Proglib Academy продлевает розыгрыш MacBook Pro 14 до 30 ноября!
Что нужно:
⚡️ выбрать курс;
⚡️ пройти минимум две недели обучения (можно за два вечера);
⚡️ написать куратору #розыгрыш;
⚡️ забрать макбук.
🎓 Курсы, которые участвуют
👉 Участвовать
❤️ Proglib Academy продлевает розыгрыш MacBook Pro 14 до 30 ноября!
Что нужно:
⚡️ выбрать курс;
⚡️ пройти минимум две недели обучения (можно за два вечера);
⚡️ написать куратору #розыгрыш;
⚡️ забрать макбук.
🎓 Курсы, которые участвуют
👉 Участвовать
Team Lead на Go от 500 000 ₽
Golang-разработчик на удалёнку
Middle Go-разработчик от 180 000 ₽
Golang разработчик до 270 000 ₽
Go-разработчик с тремя годами опыта
#GoWork
Please open Telegram to view this post
VIEW IN TELEGRAM
😁3
Есть способ лучше. Кодогенерация в Go — это мощный инструмент, который автоматизирует рутину и расширяет возможности языка.
На открытом уроке «Кодогенерация в Go: код, который не пришлось писать» разберем, как это работает. Поговорим о том, когда кодогенерация уместна, какие механизмы Go ее позволяют и как это применяется в реальных проектах.
https://clc.to/v1IDpQ
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱3❤1
🧑💻 Как проверить строку на пустоту
Кажется, что проверка строки на пустоту — это простая задача. Но в Go есть несколько способов, и выбор между ними зависит от того, что вы считаете пустотой: действительно пустая строка или строка только с пробелами. Давайте разберёмся, когда использовать каждый подход.
Самый очевидный способ — сравнить длину со значением ноль или сравнить саму строку с пустой:
Часто нужно проверить не просто длину, а содержимое. Строка « » технически не пуста, но полезной информации в ней нет. Для таких случаев используем
Это убирает пробелы по краям и проверяет, что-то осталось. Если нужно проверить наличие видимых символов вообще, помогает
Главное — не усложняйте без надобности. Go ценит простоту кода.
🐸 Библиотека Go-разработчика
#GoToProduction
Кажется, что проверка строки на пустоту — это простая задача. Но в Go есть несколько способов, и выбор между ними зависит от того, что вы считаете пустотой: действительно пустая строка или строка только с пробелами. Давайте разберёмся, когда использовать каждый подход.
Самый очевидный способ — сравнить длину со значением ноль или сравнить саму строку с пустой:
if len(s) == 0 {
// строка пуста
}
if s == "" {
// строка пуста
}Часто нужно проверить не просто длину, а содержимое. Строка « » технически не пуста, но полезной информации в ней нет. Для таких случаев используем
strings.TrimSpace():if strings.TrimSpace(s) == "" {
// пуста или только пробелы
}Это убирает пробелы по краям и проверяет, что-то осталось. Если нужно проверить наличие видимых символов вообще, помогает
strings.Fields():if len(strings.Fields(s)) == 0 {
// только пробельные символы или вообще пуста
}Fields() разбивает строку по пробелам и возвращает срез непустых элементов. Если срез пуст — видимых данных нет.Главное — не усложняйте без надобности. Go ценит простоту кода.
#GoToProduction
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🔥2❤1🥱1
