Библиотека Go-разработчика | Golang
23.3K subscribers
2.08K photos
42 videos
87 files
4.45K links
Все самое полезное для Go-разработчика в одном канале.

По рекламе: @proglib_adv

Учиться у нас: https://proglib.io/w/32d20779

Для обратной связи: @proglibrary_feeedback_bot

РКН: https://gosuslugi.ru/snet/67a4a8c2468
Download Telegram
Ищем копирайтера

Нам нужен человек, который:
— Любит IT и русский язык.
— Понимает разницу между бэкендом и фронтендом, OWASP и MISRA, функциональным программированием и ООП, микроконтроллером и миникомпьютером, UX и UI.
— Имеет опыт работы от 1 года.
— Будет плюсом, если вы программируете на каком-нибудь языке на уровне стажера/джуна.

Что нужно делать:
— Готовить подборки, ТОПы книг, ютуб- и телеграм-каналов по языкам программирования.
— Делать расшифровки топовых Ютуб-роликов по теме программирования и оформлять их в виде статей.
— Готовить новостные заметки.
— Актуализировать старые статьи.
— Брать интервью у экспертов. Мы поможем с поиском экспертов.
— Иногда писать небольшие рекламные посты в телеграм.
— Писать статьи с кодом, переводить статьи (по желанию, оплачивается отдельно).

Можно использовать нейронки?
— Да, главное, чтобы материал получился интересный.

Условия:
— Белая зарплата: 50 000 руб.
— Возможность работать удаленно.

👉Присылайте свои резюме: hello@proglib.io
7👍3🥱1
#tip #go

Типичная ситуация: пакет document не должен зависеть от пакета storage, но типу document.Doc нужен способ загрузки и сохранения содержимого.

В Go для создания и DI требуется три шага без каких-либо фреймворков. Примеры псевдокодом👇

1️⃣ Пакет document

Определите интерфейс в пакете document.

type Storage interface {
Load(int) Content <i>// some content type</i>
Save(Content) int
}

Сделайте интерфейсную часть типа Doc, чтобы позже подключить фактическое хранилище.

type Doc struct {
Cont Content
Store *Storage
}

Используйте этот интерфейс в функциях или методах, которые загружают или сохраняют содержимое документа.

func (d *Doc) LoadById(id int, s Storage) {
d.Cont = d.Store.Load(id)
}
<i>// same for Save...</i>

2️⃣ Пакет storage

Определите тип, который реализует интерфейс.

type DBStore struct {
db *database.DB
}
func (d *DBStore) Load(id int) Content {
<i>// ... load content by id</i>
}
<i>// same for Save...</i>

3️⃣ Пакет main

Подключите хранилище при создании документа. Предположим, что у нас есть объект приложения в main.

App.Doc.Store = storage.NewDBStore(...)
🥱21🔥4👍3😁1🌚1
👀 Структурированное логирование с slog: взгляд команды Go

🔹Экскурсия по slog
🔹Производительность
🔹Проектирование пакета slog (одно из самых крупных дополнений к стандартной библиотеке с момента выпуска Go 1)

🔗 Читать
51
#холивар

🤔Что самое трудное в работе программиста? Правильно, выдумывать имена для переменных.

💬Как вы считаете, насколько важен хороший нейминг для сущностей (функций, переменных и т.д.) в вашем коде? И есть ли у вас или в вашей команде общепринятые правила или лучшие практики, которым вы следуете при нейминге?

Если да, поделитесь опытом👇
gRPC в Go: практическое введение от Олега Козырева, Senior Software Engineer в Avito Tech.

📺Смотреть
👍14🥱4🔥2
Как визуализировать модели GORM с помощью Atlas

Вдогонку к очень холиварному предыдущему посту ловите мини-гайд о том, как использовать новую фичу Atlas, которая позволяет разработчикам быстро создавать визуализации диаграммы «сущность-связь» (или ERD) схем баз данных.

В гайде показано, как эту функцию можно использовать в тандеме с одной из основных возможностей Atlas — «Загрузчиками схем» — для создания визуализаций моделей GORM.

Atlas — это независимый от языка инструмент для управления и миграции схем баз данных с использованием современных принципов DevOps.
👍18🤔1
Обзор альтернатив стандартной библиотеке для регулярных выражений в Go с бенчмарками по скорости и потребляемой памяти.

🔗 Читать
🔥21
fp-go — библиотека функционального программирования для Go, идея для разработки которой взята из проекта fp-ts. Цель библиотеки — предоставить набор типов данных и функций, которые позволяют легко и увлекательно писать поддерживаемый и тестируемый код на Go.

💡На скриншоте — статистика проекта за последние 28 дней. Выводы сделаете сами.

🔗 GitHub
👍11🥱5🤔3
#tip #go #security

Два способа проверить свой код на наличие уязвимостей

📌Инструмент govulncheck, безусловно, является универсальным для сканирования репозиториев на наличие известных уязвимостей.

🔸Инструмент использует официальную базу данных уязвимостей Go vuln.go.dev, всеобъемлющий источник известных уязвимостей в общедоступных модулях Go.

🔸Govulncheck можно использовать в командной строке или как часть рабочего процесса CI.

📌Еще одним инструментом, заслуживающим внимания, является gosec: Golang Security Checker.

🔸gosec — CLI-инструмент, который может быть интегрирован в пайплайн CI. В дополнение к этому, gosec входит в состав golangci-lint.

🔸По умолчанию он отключен, и вы можете включить либо все проверки на уязвимости, либо только определенные из них. Таким образом, ваш код проверяется на наличие уязвимостей каждый раз, когда ваша IDE запускает линтер.

🔸В отличие от govulncheck, gosec не проверяет наличие известных уязвимостей в общедоступном коде Go. Скорее, он проверяет код на соответствие списку уязвимых шаблонов программирования, включая: жестко закодированные учетные данные, непроверенные ошибки, построение SQL-инструкций с использованием fmt и т.д.
👍6🔥1
🤔Надеемся, материалы про пакет slog в Go вам еще не надоели. Потому что самое время закрепить представленную ранее теорию интересной практикой на примере создания красивого логгера.

😎Если кто-то из вас уже знаком с пакетом zap от Uber, вы быстро найдете общий язык с slog👇

🔍Создаем красивый обработчик логов для CLI, который делает логи намного читабельнее, используя только стандартную библиотеку. С цветами, отступами и всем, что нужно для удобства.

⚡️Есть еще кое-что. В официальном репозитории Go есть руководство по написанию обработчиков slog — сохраняйте себе в заметки.
👍25🥱1
6_Tips_on_High_Performance_Go_—_Advanced_Go_Topics_by_David_Lee.pdf
4.6 MB
6 советов, которые помогут диагностировать и устранять проблемы с производительностью: быстрое введение для Go-разработчика

1⃣ Бенчмаркинг
2⃣ Профилирование
3⃣ Оптимизация компилятора
4⃣ Inlining
5⃣ Escape Analysis
6⃣ Конкурентность

🔗 Читать (pdf-файл для тех, у кого не открывается Medium)
👍6🥱1
🤔🚀Особенности и полезные приемы Go

Вы можете быть продуктивным Go-разработчиком, не зная и не используя большинство из этих приемов, но некоторые из них могут быть полезны:

▪️Declaration, control flow, typesystem
▪️Concurrency, unsafe, reflect
▪️Arrays, validation, build constraints
🔥10👍1
#холивар

Не так давно мы спрашивали вас про пет-проекты, из чего получился неплохой холивар.

💬Главный вопрос с нашей стороны остался в стороне: «Возможно ли завершить такой проект? Если да, то как вы это сделали?».

🤔Ведь постоянно (особенно перед сном) приходят мысли что-то доработать, добавить новый функционал.
5👍2
Go 1.21: все, что вам нужно знать

Визуальный путеводитель в виде доски Miro по наиболее важным аспектам Go 1.21. Существуют также для предыдущих версий Go 1.20 и 1.18.
🔥933
#tip

Колхозный, но для кого-то может и интересный совет: пишем shell-скрипты на Go

Сверхбыстрый компилятор Go заставляет Go чувствовать себя почти как скриптовый язык (на этапе компиляции, конечно; во время выполнения Go легко опережает любой интерпретируемый язык).

А как на счет того, чтобы запускать файл .go как shell-скрипт? Без использования go run и без необходимости помнить расположение .go файла?

Когда скрипт с шебангом (#!) выполняется как программа в Unix-подобных ОС, загрузчик программ рассматривает остаток строки после шебанга как имя файла программы-интерпретатора, например:

#!/usr/bin/env awk -f
BEGIN { print "Don't Panic!" }

После сохранения этого фрагмента в файл scriptname и изменения прав, вы можете вызвать его как ./scriptname или переместить в директорию в вашем $PATH и вызвать, как бинарный файл.

К сожалению, шебанг не работает для исходных файлов Go. Для большинства скриптовых языков символ "#" используется в качестве комментария. В Go это недопустимый синтаксис.

#!/usr/bin/env go run "$0" "$@"
package main

import "fmt"
func main() {
fmt.Println("My first Go script")
}


Но решение есть. Этот хитрый способ превращает .go файл в shell-скрипт в большинстве Unix-подобных ОС:

///usr/bin/env go run "$0" "$@"; exit
package main

import "fmt"
func main() {
fmt.Println("My first Go script")
}

Если вы сохраните этот фрагмент в файл filename.go и сделаете исполняемым, вы сможете вызвать скрипт как ./filename.go.

📌Как это работает?

Команда env ищет go по пути и выполняет его, устраняя необходимость использования жестко закодированный путь к бинарю.

Путь к env начинается с трех косых черт. Таким образом, вся строка выглядит как комментарий. В то же время путь является допустимым синтаксисом оболочки.

Технически, двух косых черт может быть достаточно, но три косые черты более соответствуют стандартам — они всегда интерпретируются как одна косая черта.

Если env находит go по пути, он вызывает go run $0 $@.

Первая переменная $0 относится к самому файлу скрипта, а $@ представляет дополнительные параметры, переданные скрипту в командной строке. Внутри Go-скрипта эти параметры доступны через os.Args[].

Happy coding scripting!
🔥317👏7👍6🥱1
💡Залог успешного CLI-инструмента на Go — это удобство для пользователя, гибкость и постоянные улучшения. Именно таких принципов придерживается автор сегодняшнего руководства и нескольких CLI-проектов с открытым исходным кодом.

🚀Автор делится советами, полученными при написании CLI-проектов OpenFaaS, actuated, action-usage, arkade и k3sup, начиная с 2016 года.

📌Основные моменты:

▫️Начинайте с простой команды и постепенно расширяйте возможности CLI
▫️Используйте инструмент Cobra
▫️Постоянно улучшайте пользовательский опыт, минимизируя необходимость ввода лишних данных
▫️Управляйте токенами авторизации удобным способом, вдохновляясь другими инструментами
▫️Используйте различные форматы вывода для гибкости
▫️SSH может быть альтернативой HTTP для автоматизации
▫️Тщательно документируйте все команды

🔗Читать
7👍5