Skip to main content

Блог переїхав

Блог переїхав на HUGO . Нова адреса сайту  https://sheremetat.dev

Golang: підбірка корисних бібліотек для початківців і не тільки

Пошук хорошої бібліотеки чи фреймворку - важка задача, особливо коли тільки знайомишся з новою технологією. Величезне різноманіття бібліотек, з їхніми плюсами та мінусами, породжує сумніви в правильності вибору, оскільки на stackoverflow.com чи інших ресурсах для програмістів скільки людей стільки й думок, що тільки ускладнює задачу.

Коли я почав розбиратись з Golang та її екосистемою я зіштовхнувся саме з цією проблемою. Після Java і Spring Boot, з вбудованими автоконфігураціями та бібліотеками на всі випадки життя, парсити "руками" параметри http запиту, писати Make файли для збірки програми та імпортувати залежності з повним шляхом відносно $GOPATH було, м`яко кажучи, незвично. Аналіз популярних підходів та експериментів вилився в список бібліотек, без яких я не починаю нового проекту на Golang.
gb - інструмент для збірки програм на Go
Крім команд build і test, які є характерними для подібних бібліотек, gb використовує vendoring для керування залежностями й не потребує жодного спеціального файлу конфігурації. Проект вважається проектом gb, коли його код знаходиться в папці src/. Залежності додаються до проекту командою gb vendor fetch [...] і зберігаються в папку vendor/, а їх список з версіями формується в файлі vendor/manifest. Саме файл vendor/manifest потрібно додати до системи контролю версій (інші папки з vendor/ можна додати в ігнор-файл) і тоді відновити залежності можна командою gb vendor restore.

Якщо ви використовуєте Visual Studio Code потрібно додати поле "go.gopath" зі значенням "${workspaceRoot}:${workspaceRoot}/vendor" в Settings для того, щоб IDE знала де шукали залежності, яких немає в системному $GOPATH.

gorilla/mux - маршрутизатор і диспетчер http запитів

Якщо ви пишете свій Web сервер - ця бібліотека саме для вас. Вона вміє матчити запити по багатьох параметрах, таких як host, path, scheme, HTTP methods та багатьох інших. Бібліотека в роботі виглядає приблизно так:

r := mux.NewRouter()
r.HandleFunc("/products/{key}", ProductHandler)
r.HandleFunc("/articles/{category}/", ArticlesCategoryHandler)
r.HandleFunc("/articles/{category}/{id:[0-9]+}", ArticleHandler)
r.HandleFunc("/articles/{category}/{sort:(?:asc|desc|new)}", ArticlesCategoryHandler)

а зчитування параметрів в HttpHandler так:

vars := mux.Vars(request)
category := vars["category"]

logrus - Логер для Go

Golang в своїй стандартній бібліотеці містить вбудований логер, проте він не має звичних для нас рівнів info, debug, error, тощо. API бібліотека logrus дозволяє розділити логування на різні рівні:

log.Debug("Useful debugging information.")
log.Info("Something noteworthy happened!")
log.Warn("You should probably take a look at this.")
log.Error("Something failed but I'm not quitting.")
// Calls os.Exit(1) after logging
log.Fatal("Bye.")
// Calls panic() after logging
log.Panic("I'm bailing.")

Також вивід в консоль стане "кольоровим" (при підключеному TTY):

testify - набір інструментів для зручного тестування

Якщо ви вже писали юніт-тести на Golang, то, мабуть, помітили, що вона не містить вбудованих asserts. І тому перевірка результату тесту має зовсім непривабливий вигляд, який відлякує розробників від написання тесту, а також часто змушує використовувати бібліотеку reflect.

users := ...
expected:= ...
if !reflect.DeepEqual(users, expected) {
    t.Errorf("expected %+v, got %+v", expected, users)
}

Бібліотека testify дозволяє скоротити код тесту і зробити його простішим для читання, адже тести - найкраща документація коду.

users := ...
expected:= ...
assert.Equalf(t, expected, users, "expected %+v, got %+v", expected, users)

mgo.v2 - Багатий MongoDB драйвер для Go

mgo (читається як манго) - дуже зручна бібліотека для роботи з MongoDB. Нема сенсу описувати можливості цієї бібліотеки - якщо ви вже працювали з MongoDB, то з легкістю зможете працювати з бібліотекою.
Її API розділено на три частини, які потрібно імпортувати в проект окремо, в залежності від ваших потреб.
API docs for mgo
API docs for mgo/bson
API docs for mgo/txn

sqlx - розширення для пакета database/sql

Sqlx - це бібліотека, яка розширює стандартну бібліотеку database/sql. По своїй внутрішній структурі вона є надбудовою над стандартною бібліотекою.
Основними фічами є:
  • Marshal рядків в структури (з вбудованою підтримкою структур), map та slice
  • Пре-підготовка запитів
  • Get та Select, щоб швидко перейти від запиту до struct/slice

Go Kit - Набір інструментів для мікросервісів

Розробники стверджують, що Go Kit схожий на Dropwizard, Spring Boot чи Netflix Eureka і вміє працювати з Kubernetes, Docker, Heroku та іншими популярними сервісами для роботи з мікросервісними архітектурами. Я особисто не працював з цією бібліотекою, але оскільки вона виглядає перспективною - я додав її до цього списку

...та багато інших

Golang - відносно молода екосистема, тому нові бібліотеки з`являються досить часто. На GitHub є репозиторій awesome-go, який містить величезний список бібліотек. В більшості вони протестовані комьюніті і їх можна відносно сміливо використовувати. Також існує сайт https://golanglibs.com/ де також можна знайти безліч корисних бібліотек.

Програмуйте із задоволенням!