Що таке 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 надає вам:
- Команду
go— один виконуваний файл, який відповідає за збирання, запуск, тестування, управління залежностями, форматування коду, документацію, профілювання тощо. - Компілятор і компонувальник (linker) Go.
- Стандартну бібліотеку — велику за задумом. 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.