24 100подписчиков сейчас
Публикации всего: 62
😁 18 👍 2 💯 2
Перейти к публикации →
🤩 Go tip: вшивайте файлы прямо в бинарник через go:embed
Нужны шаблоны, миграции или небольшая статика, но не хочется таскать их рядом с бинарником?
import "embed" //go:embed templates/*.html var templatesFS embed.FSДальше embed.FS можно использовать с html/template, text/template или net/http.
templates.ParseFS(templatesFS, "templates/*.html»)Можно вшить и отдельный файл:
//go:embed version.txt var version string📌 Файлы попадают в программу при сборке. Изменили ресурс — пересобирайте бинарник. Для шаблонов, миграций и небольшой статики — отличный вариант. Для огромных ассетов — уже стоит подумать о другом подходе. 🔗 Документация 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека Go-разработчика #GoToProduction
👍 6 🤩 2 🥱 1
Перейти к публикации →
✏️ Расстояния между единицами: находим нужный паттерн
Дан массив нулей и единиц, нужно проверить, что между любыми двумя единицами находится минимум k нулей. Звучит элементарно, но в реализации легко споткнуться.
Массив [1,0,0,0,1,0,0,1] при k=2 валиден: между первой и второй единицей три нуля (достаточно), между второй и третьей — два нуля (достаточно). А вот [1,0,1,0,0,1] при k=2 — нет, потому что первые две единицы разделены только одним нулём.
Запоминаем позицию последней найденной единицы. Когда встречаем новую, проверяем расстояние до неё и сразу обновляем позицию.
Это будет один проход по массиву:
func kLengthApart(nums []int, k int) bool {
lastPos := -k - 1
for i := 0; i < len(nums); i++ {
if nums[i] == 1 {
if i - lastPos - 1 < k {
return false
}
lastPos = i
}
}
return true
}
Результат: O(n) время, O(1) память.
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека Go-разработчика
#ReadySetGo
❤ 6 👾 4
Перейти к публикации →
🛠️ sqlc: пишешь SQL → получаешь типобезопасный Go
Вместо ORM и ручного Scan можно оставить SQL как есть, а Go-код сгенерировать:
-- name: GetAuthor :one SELECT id, name, bio FROM authors WHERE id = $1;
sqlc generateПосле генерации:
author, err := queries.GetAuthor(ctx, id)sqlc проверяет запросы относительно схемы и генерирует типизированные структуры и методы. Поддерживаются PostgreSQL, MySQL и SQLite. ⚡️ Документация 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека Go-разработчика #GoToProduction
👍 12 🥱 7 🤔 3 · всего 24
Перейти к публикации →
🛡 Go tip: не открывайте локальный сервис наружу случайно
Если HTTP-сервис должен быть доступен только на вашей машине, слушайте
127.0.0.1, а не 0.0.0.0:
srv := &http.Server{
Addr: "127.0.0.1:8001",
}
127.0.0.1 — только локальный интерфейс.
А:
Addr: "0.0.0.0:8001»означает прослушивание всех IPv4-интерфейсов. 📌 Для локальных админок, debug-сервисов и dev-инструментов это простая настройка, которую легко забыть — и случайно выставить сервис в сеть. 📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека Go-разработчика #GoToProduction
❤ 9 🥱 7 👍 2 · всего 21
Перейти к публикации →
💡 Как append растит слайс
Все знают, что
append добавляет элемент в слайс. А вот что происходит, когда место в массиве кончилось, знают не всегда, и как раз тут прячется пара неожиданностей.
🔵 Пока есть запас
У слайса есть len и cap. Пока len меньше cap, append дописывает элемент прямо в тот же массив и возвращает слайс, который смотрит туда же. Никакого копирования, дёшево. Именно поэтому два слайса, делящие один массив, могут внезапно перетирать данные друг друга при append в один из них.
🔵 Когда запас кончился
Как только cap исчерпан, рантайм выделяет новый массив побольше, копирует туда старые элементы и возвращает слайс уже на новую память. С этого момента старый и новый слайс не связаны, и запись в один не видна в другом. Отсюда правило, которое многих спасало от багов. Всегда присваивайте результат обратно.
s = append(s, x)🔵 На сколько растёт Точный коэффициент это деталь реализации, которая менялась от версии к версии, поэтому закладываться на конкретное число не стоит. Грубый ориентир такой. Маленькие слайсы растут примерно вдвое, большие прибавляют около четверти за раз, а переход между режимами сглажен в районе нескольких сотен элементов. Смысл в том, чтобы амортизировать стоимость и не копировать массив на каждом добавлении. Если вы заранее знаете примерный размер, выделяйте вместимость сразу.
s := make([]int, 0, n)
for i := 0; i < n; i++ {
s = append(s, f(i))
}
Так вы избегаете череды перевыделений и копирований, а заодно снимаете нагрузку со сборщика мусора. На горячих циклах это заметно.
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека Go-разработчика
#GoDeep
👍 6 🥱 4 ❤ 2 · всего 13
Перейти к публикации →
⚙️ Go tip: errgroup вместо ручного управления группой горутин
Нужно параллельно выполнить несколько задач, остановиться при ошибке и ограничить количество одновременно работающих операций?
Вместо WaitGroup + канала ошибок можно использовать golang.org/x/sync/errgroup:
g, ctx := errgroup.WithContext(ctx)
g.SetLimit(8)
for _, url := range urls {
g.Go(func() error {
return fetch(ctx, url)
})
}
if err := g.Wait(); err != nil {
return err
}
WithContext отменяет контекст при первой ошибке, SetLimit(8) держит максимум 8 активных горутин, а Wait() возвращает ошибку.
🔗 Источник
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека Go-разработчика
#GoToProduction
👍 18 🥱 5 ❤🔥 2 · всего 27
Перейти к публикации →
🔎 Go tip: откуда в проекте взялась эта зависимость?
Нашли незнакомый модуль в go.mod и не понимаете, кто его подтянул?
Поможет:
go mod why -m golang.org/x/textGo покажет цепочку зависимостей, из-за которой модуль оказался нужен проекту. Например:
your-project
↓
github.com/example/api
↓
golang.org/x/text
📌 Полезно перед чисткой go.mod, обновлением зависимостей или разбором supply chain.
А если нужно посмотреть, какие модули вообще используются, пригодится:
go mod graph📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека Go-разработчика #GoToProduction
👍 12 🎉 2
Перейти к публикации →
Go-Go-Gadg...Error? Смотрим, как ошибаются Go разработчики!
В Go разработчики ошибаются как и в любом другом языке: опечатки, дубликаты, нерабочие условия проверок и тому подобное.
Но почему? Ведь многие используют тот же go vet который прекрасно находит всё это… ведь так... да?
На вебинаре разработчик PVS-Studio Глеб Асламов разберет частые и типовые ошибки Go разработчиков в известных проектах. А еще вы узнаете, какие ошибки не могут найти стандартные инструменты и подходы (и что с этим делать).
Регистрируйтесь по ссылке! После вебинара все регистранты получат запись.
Подписывайтесь на PVS-Studio, чтобы оставаться в курсе последних новостей о статическом анализе:
— Telegram
— MAX
❤ 2 🔥 2
Перейти к публикации →
😁 16 👏 3 ❤ 2
Перейти к публикации →
История названий канала
14.08.2026
название
Библиотека Go разработчика
→
Библиотека Go-разработчика | Golang
Дата — момент, когда изменение заметил наш обход.