37.1K subscribers
1.46K photos
34 videos
5 files
1.62K links
加入频道
1

сделаем это пост полезным - выкладывайте в комментариях свои проекты, код, наработки, лучшие попадут в подборку.
👣 Go-mongox

Пакет Go Mongo, поддерживающий операции по работе с документами и эффективным компоновщиком данных BSON с использованием различных типов данных.

BSON - бинарная форма представления простых структур данных и ассоциативных массивов (которые в контексте обмена называют объектами или документами)

go get github.com/chenmingyong0423/go-mongox

#golang #MongoDB

Github

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Лимит на количество открытых дескрипторов

▶️Вопрос, связанный с написанием демона на Go при помощи go-daemon:
какой лимит по умолчанию на количество открытых дескрипторов файла в Go? Как его менять? И есть ли общепринятые рекомендации по их количеству?


▶️Начать стоит с проверки ulimit -a и ulimit -aH в shell'е перед запуском вашего демона. Это быстро покажет текущие "мягкие" и (второй вызов) "жесткие" ограничения. При помощи ulimit можно открутить мягкие ограничения до пределов жестких. Следует понимать, что ulimit меняет только текущие лимиты, для шелла и всех программ, запущенных в этом шелле, поэтому после завершения сессии или даже в другом окне терминала значения останутся прежними.

🟡Следующее место задания ограничений, на этот раз постоянных — это /etc/security/limits.conf и каталог /etc/security/limits.d/, ограничение называется nofile. Редактировать (а, иногда, и смотреть) эти файлы может только суперпользователь ("root"). Там задаются ограничения на отдельных пользователей или группы, применяемые на всю сессию данного пользователя, или всех пользователей определенной группы.

🟡И наконец, есть "системное ограничение", задаваемое через sysctl - это fs.nr_open:
/sbin/sysctl -n fs.nr_open
ему же соответствует файл /proc/sys/fs/nr_open

🟡"Программно" манипулирование лимитами текущего процесса в пределах жестких ограничений, заданных на сессию, осуществляется через вызовы getrlimit/setrlimit, которые можно звать из Go, используя FFI (примеры можно посмотреть здесь)

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Паттерн Repository в Go

Repository — это прослойка между бизнес-логикой и источником данных, которая абстрагирует приложение от конкретных деталей работы с базой данных. Это позволяет разделить логику работы с данными от логики приложения и облегчает поддержку и расширение приложения. Кроме того, использование Repository способствует повышению тестируемости кода.
Основная идея — отделить интерфейс хранилища данных от его реализации. Тогда мы можем использовать различные реализации хранилища, обладающие одним интерфейсом

Рассмотрим следующий пример. У нас есть некоторый микросервис, который хранит данные пользователя. Для описания пользователя создадим пакет entity/user

📎 Читать дальше

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Шаблон backend сервера на Go

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

Шаблон включает в себя:
Передачу параметров для запуска HTTP сервера через командную строку — github.com/urfave/cli
Настройка параметров сервера через конфигурационный файл — github.com/sasbury/mini
Настройка параметров TLS HTTP сервера
Настройка роутера и регистрация HTTP и prof-обработчиков — github.com/gorilla/mux
Настройка уровней логирования без остановки сервера — github.com/hashicorp/logutils
Настройка логирования HTTP трафика без остановки сервера
Настройка логирования ошибок в HTTP response без остановки сервера
HTTP Basic аутентификация
MS AD аутентификация — gopkg.in/korylprince/go-ad-auth.v2
JSON Web Token — github.com/dgrijalva/jwt-go
Запуск сервера с ожиданием возврата в канал ошибок
Использование контекста для корректной остановки сервера и связанных сервисов
Настройка кастомной обработки ошибок — github.com/pkg/errors
Настройка кастомного логирования
Сборка с внедрением версии, даты сборки и commit

🖥 GitHub

На изображении — UML-диаграмма последовательности запуска и остановки сервера

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Самоизменяющийся бинарник (Self Modifying Binary)

▶️Возможно ли создать самоизменяющийся бинарник на Go? К примеру, программа должна отобразить сколько раз она была запущена и время последнего запуска, выглядеть это может как-то так:
./goprogram
1 29.06.2099 14:10
./goprogram
2 29.06.2099 14:12
./goprogram
3 29.06.2099 15:10
./goprogram
4 30.06.2099 14:10

При этом ни каких дополнительных файлов или записей не должно создаваться.

На Purebasic довольно просто такое реализовать:
• Скомпилированный бинарный файл создаёт свою копию.
• Записывает в конец файла число.
• Замещает оригинал изменённой копией.
• При повторном запуске выводит записанное число.
• Можно пример такой реализации на Go?


▶️Вообще, это небезопасно, и наверняка будет запрещено антивирусами и прочими системами безопасности. Не говоря уже о разнице в различных ОС. Тем не менее, можно сделать как-то так (обработка ошибок опущена для краткости):
type persistent struct {
Magic [8]byte
Content int64
}

var p = persistent{
Magic: [8]byte{0xBA, 0xDD, 0xFA, 0xCE, 0xBE, 0xEF, 0xCA, 0xCE},
Content: 0,
}

func main() {
fmt.Println(p.Content)

const size = int(unsafe.Sizeof(p))
currentBuf := bytes.NewBuffer(make([]byte, 0, size))
err := binary.Write(currentBuf, binary.LittleEndian, p)

newP := p
newP.Content++

newBuf := bytes.NewBuffer(make([]byte, 0, size))
err = binary.Write(newBuf, binary.LittleEndian, newP)

currentBytes, newBytes := currentBuf.Bytes(), newBuf.Bytes()
self, err := os.OpenFile(os.Args[0], os.O_RDONLY, 0755)
selfBytes, err := ioutil.ReadAll(self)

i := bytes.Index(selfBytes, currentBytes)
copy(selfBytes[i:i+size], newBytes)
newSelf, err := ioutil.TempFile("", "selfmodifying")
_, err = newSelf.Write(selfBytes)
err = os.Rename(newSelf.Name(), self.Name())
err = os.Chmod(self.Name(), 0755)
}


📎 Полный пример кода тут.

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Как добавить метаданные в изображение?

Вот задача — дано изображение в виде слайса байт, в которое нужно добавить метаинформацию вроде заголовков exif.
Практиески все библиотеки на Go дают возможно считать метаинформацию из файла, но не записать.

Благо, есть такая библиотека go-exif, которая умеет править или создавать новые exif-блоки:
🖥 GitHub

Немного подробностей про go-exif:
Требования: Go >= 1.17, поддержка только для тестирования и CI.

Пакет содержит рабочие примеры и модульные тесты для обучения работе с EXIF.

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

Проект управляется конфигурацией и позволяет добавлять пользовательские IFD и пользовательские бирки.

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 go-size-analyzer

Инструмент для анализа размера зависимостей в скомпилированных бинарных файлах
Go.

Github

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Pdfcpu — инструмент для работы с pdf, написанный на Go

Предлагает массу вариантов работы с pdf:
• аннотирование
• создание pdf с помощью json
• извлечение изображений, текста и т.д.
• объединение нескольких pdf
• поворот, изменение размера

Отличный инструмент для pdf, да и в плане демонстрации возможностей Go тоже — исходный код открыт, можно форкать, добавлять свои возможности

▶️ Страничка pdfcpu
🖥 GitHub

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Фаззинг-тестирование в Go, gofuzz и go-fuzz

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

▶️ Собственно, о фаззинг-тестировании и пойдёт речь в данной статье
▶️Gofuzz

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥 Дайджест полезных материалов из мира Golang за неделю

Инструменты недели:
📌 go-size-analyzer - инструмент для анализа размера зависимостей в скомпилированных бинарных файлах
Go.
📌 Go-mongox - пакет Go Mongo, поддерживающий операции по работе с документами и эффективным компоновщиком данных BSON с использованием различных типов данных.
📌Dendy - это эмулятор NES/Famicom, написанный на Go и названный в честь советского клона Famicom, который был у многих в детстве.
📌 The Gowebly CLI - инструмент интерфейса командной строки, который упрощает создание Go приложений на серверной части.

Почитать:
Fuzzing-тестирование. Практическое применение
Почему теряются поля при конвертации?
Бойлерплейт как инструмент стандартизации Go-проектов
Как добавить метаданные в изображение?
Пишем поиск семантически похожих текстов (или товаров) за полчаса на Go и Postgres (pgVector)
Шаблон backend сервера на Go
Использование миграций баз данных в Go
My weekly dev.to recommendations
What’s New in Go 1.22: cmp.Or
Golang in-memory key-value pair cache
Golang generator functions (Experimental in 1.22)
From Homemade HTTP Router to New ServeMux
(Part 5)Golang Framework Hands-on - KisFlow Stream Computing Framework-Function Scheduling
Go Program pattern 04:Map-Reduce
Live reload em Go com docker e compile daemon
Go program pattern 05 : Decorations
Go program pattern 03:Inversion of Control
Gin + Gorm Practical Guide, Implementing a Simple Q&A Community Backend Service in One Hour
"The Two Reasons I Prefer Passing Struct Pointers Around"

Посмотреть:
🌐 Разработка полноценного распределенного хранилища файлов на Go ( 9:57:00)
🌐 Why Golang's IO.READER Is More Important Than You Think ( 06:38)
🌐 Расследуй убийство с SQL. Игры, которые реально учат писать код. ( 03:52)
🌐 3 Important Use Cases Why The Industry Is Using Kafka ( 07:52)
🌐 When Should You Pick NEOVIM Over VSCODE? ( 01:00)
🌐 Ultimate Golang - HTMX - TEMPL - TAILWIND Project Template ( 02:35:23)
🌐 DEPENDENCY INJECTION IN GOLANG? YEAH YIKES ( 01:55:43)
🌐 Внутреннее устройство планировщика Go ( 01:01:57)

Хорошего дня!

@Golang_google
👣 Как мы ускорили Golang-тесты на CI

Неплохая статья, которая даёт понимание, как используется Go в бигтехе.

О чём?
В СберМаркете микросервисная архитектура. В качестве CI/CD используется GitLab. На CI гоняются вполне типовые задачи по тестированию, различным проверкам, сборкам образов и т. д. Часть job предоставляется самим сервисом, часть — внедряется в пайплайн сервиса нашей платформой.
Во всех golang-сервисах пишут тесты на свой код, которые в среднем гоняются на CI более 5 минут.
Поэтому автор подумал, что неплохо бы это всё ускорить — собственно, этим он и решил поделиться

📎 Статья

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

Devcards предоставляет интерактивную визуальную среду для Go, аналогичную REPLY и python ноутбукам, таким как Jupyter.


go install github.com/igorhub/devcard/cmd/devcards@latest


Github

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Список вопросов на позицию Go-разработчика в МТС

🟡Встречайте большой список вопросов с собеседований в МТС. Примерно те же вопросы встречаются и в других бигтех-компаниях, так что список почти универсальный

🟡Вопросы разбиты по таким секциям, это не только Go:
— Секция 1, системный минимум
— Секция 2, минимум по Go
— Секция 3, форматы данных
— Секция 4, базы данных
— Секция 5, сети
— Секция 6, брокеры, очереди сообщений
— Секция 7, инфраструктура и архитектура
— Секция 8, алгоритмы

▶️ Вопросы

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Gitbook по основам Go и тестированию приложений

Открытый учебник по Go с упором на тестирование и test coverage

▶️ Gitbook

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