Перейти до змісту

Що таке Go (екосистема)

Go (часто пишуть «Golang» для кращої пошуковості) — це статично типізована компільована мова програмування, розробка якої розпочалася в Google у 2007 році, а відкритим кодом вона вийшла у 2009 році. Її авторами є Роберт Грізмер, Роб Пайк та Кен Томпсон.

Цілі проектування

Go розроблено так, щоб полегшити роботу з великими кодовими базами:

  • Швидка компіляція навіть великих програм.
  • Швидке виконання — близьке до C/C++ для багатьох задач.
  • Достатня простота, щоб інженери могли читати код одне одного без несподіванок.
  • Вбудовані примітиви конкурентності (горутини (goroutines), канали).
  • Потужний, опінійний набір інструментів, що постачається разом із компілятором.

Підтримка та графік випусків

  • Відкритий код під ліцензією BSD-3.
  • Розробляється відкрито на github.com/golang/go.
  • Спонсорується Google; дизайнерські рішення проходять через публічний процес Go proposals.
  • Нові мінорні версії виходять приблизно кожні шість місяців (у лютому та серпні).
  • Дві останні мінорні версії отримують патчі безпеки.
  • Обіцянка сумісності: код, написаний для Go 1.0 (березень 2012), повинен компілюватися та виконуватися на найновішому випуску Go 1.x.

Що входить у поставку Go

Встановлення Go надає вам:

  1. Команду go — один виконуваний файл, який відповідає за збирання, запуск, тестування, управління залежностями, форматування коду, документацію, профілювання тощо.
  2. Компілятор і компонувальник (linker) Go.
  3. Стандартну бібліотеку — велику за задумом. HTTP-сервер/клієнт, JSON, криптографія, шаблони, SQL-інтерфейс, тестування, профілювання, примітиви конкурентності, файловий ввід/вивід, мережеві функції та багато іншого.

Типовий Go-проект залежить від невеликої кількості зовнішніх модулів — або не залежить зовсім — оскільки стандартна бібліотека охоплює дуже широку область.

Організація коду

У Go є два терміни, які часто плутають новачки:

  • Пакет (Package) — директорія з файлами .go, що мають однакове оголошення package <name> на першому рядку. Це одиниця компіляції та одиниця видимості (ідентифікатори з великої літери експортуються, з малої — є приватними для пакета).
  • Модуль (Module) — набір пакетів, що версіонуються та розповсюджуються разом. Визначається файлом go.mod у корені модуля. Це одиниця управління залежностями.

З досвіду Python: пакет ≈ модуль/підпакет Python; модуль ≈ дистрибутивний пакет Python (те, що публікується на PyPI). Термінологія є протилежною.

Залежності

  • Немає централізованого реєстру пакетів на зразок PyPI або npm.
  • Імпорт здійснюється за URL: import "github.com/gorilla/mux".
  • Toolchain завантажує модулі безпосередньо з систем контролю версій.
  • Публічний проксі proxy.golang.org кешує кожен публічний модуль, який будь-коли запитувався. За замовчуванням go використовує цей проксі; його можна вимкнути або замінити через GOPROXY.
  • Контрольні суми кожного модуля записуються в go.sum і додатково перевіряються за допомогою публічної бази даних контрольних сум на sum.golang.org.

Інструменти навколо мови

Ці інструменти постачаються поза toolchain, але є де-факто стандартом:

  • gopls — офіційний мовний сервер Go; забезпечує функції IDE у VS Code, Neovim, JetBrains GoLand тощо.
  • dlv (Delve) — відлагоджувач (debugger).
  • golangci-lint — мета-лінтер, що агрегує десятки перевірок; стандартний інструмент у CI.

Ресурси спільноти

  • go.dev — офіційний сайт: блог, нотатки до випусків, навчальні матеріали, «Tour of Go».
  • pkg.go.dev — документація з пошуком для кожного опублікованого Go-модуля.
  • r/golang на Reddit, Slack-спільнота Gophers, список розсилки golang-nuts.

Джерела