Мова Go: що це та для яких завдань підходить

Автор: Опубліковано

Коротко: Go — мова програмування загального призначення, створена в Google, яку розвивають як проєкт із відкритим кодом. Найчастіше її використовують для створення серверних сервісів, інструментів, що запускаються з термінала, та інфраструктурного програмного забезпечення. Вона поєднує відносно простий синтаксис, компіляцію в машинний код і вбудовані механізми конкурентності — організації багатьох завдань, виконання яких може перекриватися в часі.

Чим Go відрізняється від інших мов?

Офіційна назва мови — Go, хоча в пошуковиках і розмовах ви також зустрінете назву «Golang». Вона не позначає іншу версію чи окрему технологію. Go також не має стосунку до однойменної настільної гри.

Go — статично типізована мова: типи даних перевіряються під час компіляції, до запуску програми. Компілятор перетворює вихідний код на програму для вибраної системи й архітектури процесора. Він також дає змогу завчасно виявити частину помилок, наприклад спробу використати текст там, де потрібне число.

Мова автоматично звільняє пам’ять, яка програмі вже не потрібна. За це відповідає механізм, який називають збирачем сміття (garbage collector). Програмісту не потрібно вручну звільняти кожну ділянку пам’яті, але він усе одно має контролювати використання ресурсів і закривати файли та з’єднання.

Кількість мовних конструкцій у Go навмисно обмежена. Мова не пропонує класичного успадкування класів, відомого з Java; для організації даних і поведінки вона використовує, зокрема, структури та інтерфейси. Помилки зазвичай повертаються як значення, які код, що викликав функцію, має явно перевірити.

Для чого використовують Go?

Go добре підходить для програм, що працюють із мережею, обробляють запити та поєднують різні системи. Стандартна бібліотека мови містить, зокрема, засоби роботи з HTTP, JSON, файлами й тестами, тож багато базових завдань можна виконати без великого набору додаткових бібліотек.

Типові застосування:

Наприклад, інтернет-магазин може мати окремий сервіс на Go, який отримує статус відправлення від кількох перевізників і надає відповідь у єдиному форматі для кабінету клієнта. Go тут є доречним вибором завдяки мережевим інструментам і підтримці конкурентних операцій. Проте сама мова не розв’яже проблем з обмеженнями зовнішніх API, збоями чи помилковою логікою обробки замовлень.

Як працює конкурентність у Go?

Основний механізм конкурентності в Go — goroutines: легковагові завдання, якими керує середовище виконання мови. Якщо перед викликом функції поставити ключове слово go, вона виконуватиметься конкурентно з іншими завданнями. Goroutine не є окремим потоком операційної системи: середовище Go планує виконання цих завдань на потоках.

Для взаємодії між завданнями можна використовувати канали — механізм передавання значень і синхронізації роботи. Також доступні блокування для захисту спільних даних. Використання goroutines не усуває автоматично ризику взаємних блокувань або одночасного небезпечного доступу до пам’яті.

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

Конкурентність — не те саме, що паралельність. Перша стосується організації завдань, друга — їхнього фактичного одночасного виконання, наприклад на кількох ядрах процесора. Більша кількість goroutines не гарантує швидшої роботи програми: обмеженням може бути база даних, пропускна здатність мережі або витрати на синхронізацію.

Коли обрати Go, а коли — іншу мову?

Go варто розглянути, якщо ви створюєте самостійний мережевий сервіс або інструмент, який має бути легко запускати на серверах. Часто програму можна постачати як один виконуваний файл без встановлення окремого інтерпретатора. Проте це не безумовне правило: використання бібліотек C або зовнішніх файлів може додати залежності.

Інша мова може бути практичнішим вибором у таких випадках:

Це орієнтири, а не рейтинг якості мов. Обираючи мову, враховуйте доступні бібліотеки, досвід команди й вимоги конкретної програми.

Як почати вивчати Go?

Встановіть актуальну стабільну версію за інструкцією на офіційному сайті проєкту Go, перевіривши вимоги до вашої системи. Потім перевірте встановлення командою go version і створіть каталог для першого проєкту.

Збережіть у ньому файл main.go:

package main

import "fmt"

func main() {
    fmt.Println("Привіт, Go!")
}

У терміналі виконайте go mod init pryklad/pryvit, щоб створити модуль — одиницю організації проєкту та керування його залежностями. Команда go run . скомпілює та запустить програму, а go build . створить виконуваний файл. За форматування коду відповідає go fmt ./..., а тести запускають через go test ./....

Як наступну вправу створіть програму, що перевіряє статус HTTP одного сайту. Додайте обробку помилок і обмеження часу очікування, і лише потім розширте її для конкурентної перевірки кількох адрес.

Дивіться також: Що таке 2FA?

Читайте також

Дізнайтеся, як PHP-FPM обробляє запити PHP, чим відрізняється від вебсервера та як налаштувати процеси під трафік і ресурси хостингу.
Дізнайтеся, як BIND обслуговує DNS, чим відрізняються його серверні ролі та коли варто розгортати його самостійно замість керованої послуги.
Дізнайтеся, що означають польський реєстр і номер REGON, чим вони відрізняються від NIP та KRS і як перевірити дані підприємства.