Блог переїхав на HUGO . Нова адреса сайту https://sheremetat.dev
Коли я почав розбиратись з 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/ де також можна знайти безліч корисних бібліотек.Програмуйте із задоволенням!