37.1K subscribers
1.46K photos
33 videos
5 files
1.62K links
加入频道
👣 GoDS — Go-реализация разных структур данных и алгоритмов

GoDS (Go Data Structures) — это Go библиотека, в которой собраны реализации разных алгоритмов и структур данных, таких как список, множество, стек, дерево, очередь

🖥 GitHub

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Автоматическая компиляция Go проекта при изменении файлов

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

Чтобы автоматизировать это, можно использовать пакет modd:
go install github.com/cortesi/modd/cmd/modd@latest

(пакет будет скачен в ~/golang/packages/bin, как обычно)

Далее в корне проекта создадим файл modd.conf со следующим содержимым:
# Проверка всех тестов при первой запуске
**/*.go {
prep: go test @dirmods
}

# Автоматическая компиляция проекта при изменении файлов
# Исключает все тестовые файлы *_test.go
**/*.go !**/*_test.go {
prep: go build -o ./bin ./cmd/main.go
daemon +sigterm: ./bin
}

При первом запуске modd пакета будут проверены все имеющиеся тесты. Далее уже идет непосредственно настройки слежения за изменением файлов.
В данном случае мы следим за изменением всех файлов с расширением .go, кроме тестовых. При изменении содержимого какого либо go-файла будет происходить перекомпиляция всего проекта.

Строкой prep: go build -o ./bin ./cmd/main.go мы говорим, чтобы компилировался файл ./cmd/main.go, а результат его компиляции был помещен в каталоге ./bin.

Строкой daemon +sigterm: ./bin мы автоматически запускаем скомпилированный файл, в результате чего отобразится актуальный результат.

Чтобы запустить режим слежения за изменением файлов, достаточно ввести в терминале: modd
Иногда могут возникнуть случаи при которых вы будете ожидать перекомпиляцию, но она не произойдет. Например, при какой-либо серьезной ошибки в программе. Решается очевидным образом: Ctrl + C и по новой запускаем modd.

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
🎊 Выпущены версии Go 1.22.3 и 1.21.10!

📣 Анонс: https://groups.google.com/g/golang-announce/c/wkkO4P9stm0

📦 Загрузить: https://go.dev/dl/#go1.22.3

#golang

@Golang_google
👣 Реализация QUIC на чистом Go

quic-go — это Go-реализация протокола QUIC.

QUIC позволяет мультиплексировать несколько потоков данных между двумя компьютерами, работая поверх протокола UDP, и содержит возможности шифрования, эквивалентные TLS и SSL. Имеет более низкую задержку соединения и передачи, чем TCP.

Хорошо переносит потерю части пакетов путём выравнивания границ криптографических блоков по границам пакетов. В протокол заложена возможность прямой (упреждающей) коррекции ошибок на уровне пакетов, но на практике она отключена.

quic-go поддерживает HTTP/3, включая QPACK и HTTP Datagrams.

В дополнение к этим базовым RFC, quic-go также реализует и другие RFC.

🖥 GitHub
🟡 Доки

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
👣 Logdy - terminal logs in web browser

Веб-инструмент для просмотра журналов в режиме реального времени.

Транслируйте любое содержимое в веб-интерфейс с автоматически сгенерированными фильтрами.


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

$ brew install logdy

#backend #golang.

Github: https://github.com/logdyhq/logdy-core
Demo: https://demo.logdy.dev/
Инструмент: https://logdy.dev/

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
💻 Grype — сканер уязвимостей на Go для образов контейнеров и файловых систем


brew tap anchore/grype
brew install grype


Работает с Syft, мощным инструментом SBOM (software bill of materials) для контейнерных образов и файловых систем.

GitHub

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 О разных подходах к написанию тестов в Go

Обычный подход в написании теста для компонента состоит из следующего:
🟡в компонент внедряются зависимости, но не в виде конкретных типов, а через интерфейсы
🟡на основе интерфейса генерятся моки — в тестах мы вызываем методы тестируемого компонента, засетапив сначала ожидаемые вызовы мока

Такой подход приводит к тому, что в тестах фиксируется внутренняя работа компонента, хотя все, что мы хотим проверить - это, что компонент делает то что нужно, без разницы как он это делает внутри

📎 Что с этим можно сделать?
📎 В тему

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 algernon — автономный сервер на чистом Go

go install github.com/xyproto/algernon@latest

algernon — это веб-сервер со встроенной поддержкой QUIC, HTTP/2, Lua, Teal, Markdown, Pongo2, HyperApp, Amber, Sass(SCSS), GCSS, JSX, Ollama (LLMs), BoltDB (встроенный, хранит БД в файле, как SQLite), Redis, PostgreSQL, MariaDB/MySQL, MSSQL
Помимо этого algernon предоставляет ограничение скорости, плавное отключение, плагины, настройка прав доступа.
Все в одном небольшом исполняемом файле.

🖥 GitHub

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 mockery — неплохой генератор моков в Go

mockery предоставляет возможность легко генерировать моки для интерфейсов Golang с помощью пакета stretchr/testify/mock
mockery избавляет от шаблонного кодирования, необходимого для использования моков

🖥 GitHub
🟡 Доки

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Установка и использование нескольких версий Go

▶️Перед скачиванием нужной версии, создадим каталог в котором будут храниться различные версии Golang. Путь до каталога не принципиален:

mkdir ~/golang
cd ~/golang

Далее переходим на страницу официального сайта https://go.dev/dl/, с перечнем доступных версий Golang и скачиваем нужный нам архив.

Распаковываем скаченный архив в созданный каталог, у меня это ~/golang и переименовываем его так, чтобы было понятно какая это версия, например go-1.21.4. Должно получиться ~/golang/go1.21.4.

Предположим, что вышла новая версия Golang 1.21.5. Так же скачиваем архив, с данной версией на официальном сайте и распаковываем ее в созданный каталог ~/golang/go1.21.5. И того должна получиться следующая структура:

├── go-1.21.4
├── go-1.21.5

Аналогичным образом в дальнейшем добавляем другие версии.


▶️Переменные среды

🟡GOROOT — хранит путь до используемой версии Go.

Сейчас если вести в терминале команду:
go version

Мы получим ошибку go: команда не найдена. Чтобы это исправить откроем в привычном вам редакторе файл ~/.profile и добавим в него следующую конструкцию:

# golang
export GOROOT=~/golang/go1.21.5
export PATH=$PATH:$GOROOT/bin

Далее мы расширяем переменную сред PATH добавив к ее значениям $GOROOT/bin, ссылающуюся на исполняемый файл Golang.

Перезапустим терминал либо введем команду, чтобы изменения вступили в силу:

source ~/.profile


Теперь если ввести в терминале команду:
go version

Вместо ошибки увидим текущую версию — go version go1.21.5 linux/amd64.


🟡GOPATH — хранит путь до сторонних пакетов.

go get <package>
go install <package>

Необходимо явно указать каталог куда пакеты будут скачены. Создадим каталог ~/golang/packages рядом с версиями Golang.

mkdir ~/golang/packages


Остается добавить, созданный каталог в переменные среды по аналогии как это было сделано с GOROOT и того должно получиться:

# golang
export GOROOT=~/golang/go1.21.5
export GOPATH=~/golang/packages
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin

Перезапустим терминал либо введем команду, чтобы изменения вступили в силу:

source ~/.profile


@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Пишем менеджер пакетов на Go

🟡Разработка пакетного менеджера — не самая частая задача в программировании, прямо скажем. Их и готовых более чем достаточно.

🟡Однако всё же может возникнуть ситуация, когда готовые решения не подходят.
В этой статье разберём архитектуру и детали реализации пакетного менеджера на Go. Рассмотрим универсальные вещи, которые вы сможете применить к любому менеджеру пакетов, если решите его написать.

📎 Статья

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Тестирование модулей Go

🟡Модульное тестирование предполагает проверку и валидацию наименьшей тестируемой единицы в программе, такой как функция или метод в Go. Модульное тестирование гарантирует, что код работает как ожидается, и позволяет разработчикам вносить изменения в код, не случайно нарушая существующий функционал.

🟡Кроме того, автоматический запуск модульных тестов в среде непрерывной интеграции (CI) позволяет быстро обнаруживать вновь введенные ошибки, тем самым повышая стабильность программного обеспечения.

Подробнее о тестировании модулей — в статье. Если конкретнее, то речь пойдёт о:
— Проведение базовых тестов с использованием testing
— Написание testcase
— Подготовительные работы до и после тестирования
— Повышение эффективности тестирования
— Техники расширенного тестирования

📎 Статья

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Glance — self-hosted дашборд на Go, который позволяет собрать все источники информации в одном месте

Поддерживает такие виджеты:
— Контент из RSS-каналов
— Посты из субреддитов
— Погода
— Закладки
— Последние видеоролики на YouTube с определенных каналов
— Календарь
— Акции
— iframe
— Релизы GitHub
— Мониторинг сайта

Запустить, используя Docker:
docker run -d -p 8080:8080 \
-v ./glance.yml:/app/glance.yml \
-v /etc/timezone:/etc/timezone:ro \
-v /etc/localtime:/etc/localtime:ro \
glanceapp/glance


🖥 GitHub

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM