Вчимо Go з досвідом Python¶
Особисті конспект-нотатки для Python-розробника, який починає вивчати Go. Мета — пояснювати Go його власними категоріями, з короткими порівняннями з Python там, де вони допомагають загострити різницю, а не перетворити пояснення на переклад.
Усі матеріали орієнтовані на актуальний стабільний реліз Go — Go 1.27.1.
Як організовано матеріал¶
Кожна тема має свою нумеровану теку. Усередині теми конспекти й прикладні файли коду йдуть однією наскрізною нумерацією, тож порядок читання та запуску завжди очевидний.
Екосистема та встановлення¶
- Що таке Go — мова, спільнота, екосистема.
- Команда
go— кожна підкоманда, яку вам справді доведеться використовувати. go tool trace— трейсер виконання.- Типи файлів —
.go,_test.go,go.mod,go.sum, build-обмеження. - Спеціальні каталоги —
internal/,testdata/, конвенції. - Декілька версій Go —
GOTOOLCHAIN, директивиgoйtoolchain. - Встановлення — macOS, Linux, Windows.
- Додаткові інструменти —
gopls,dlv,golangci-lintта інші. - Демонстраційний проєкт — невеликий запускний модуль, який ілюструє все вищесказане.
Основи мови¶
- Змінні та константи —
var,:=,constтаiota. - Базові типи — цілі, дробові, рядки, булеві; без «правдивості».
- Перетворення типів — явне
T(x),strconv, без неявного приведення. - Оператори — арифметика, переповнення, цілочислове ділення; без тернарного.
- Керування потоком —
if,for(єдиний цикл),switch. - Функції — кілька значень, що повертаються, іменовані результати, варіативність, функції як значення.
- Помилки — значення
error, загортання через%w,errors.Is/As. - Вказівники —
&/*,nil,new, без арифметики вказівників. - Власні типи — визначення
typeпроти псевдонімів, базові типи. - Структури — поля, літерали, нульове значення, вбудовування, теги.
- Масиви та зрізи — len/cap,
appendі пастка спільного масиву-основи. - Map (асоціативні масиви) — пошук за ключем, comma-ok, пастка nil-map, множини.
- Вибір структури даних — зріз проти map проти структури проти власного типу.
- Defer — відкладені виклики, порядок LIFO, патерни прибирання.
- Panic та recover — коли панікувати, відновлення у відкладених викликах.
- Імпорти — шляхи імпорту, псевдоніми, порожній та крапковий імпорт.
Об'єктноорієнтований Go¶
- Методи — отримувачі за значенням і за вказівником, набори методів, підвищення.
- Інтерфейси — неявне задоволення, поліморфізм, порожній інтерфейс /
any. - Твердження типу та перемикачі типів — повернення конкретного типу під час виконання.
- Generics — параметри типу та обмеження.
- Патерни ООП — інкапсуляція, композиція замість успадкування, поліморфізм.
- Власні типи помилок — власні типи
error,Unwrap,errors.As, власнийIs.
Пакети та модулі¶
- Пакети та видимість — правила пакетів, експортоване проти неекспортованого,
init. - Створення та публікація модуля —
go.mod, версіонування,replace, публікація. - Структура проєкту та робочі простори —
internal/,cmd/,go.work.
Конкурентність¶
- Горутини —
go, планування,WaitGroup, пастка завершення main. - Канали — надсилання/отримання, буферизація,
close,range, взаємні блокування. - select — мультиплексування,
default, таймаути, канали done. - Синхронізація —
Mutex,Once, атоміки, детектор гонитв. - Context — скасування, дедлайни, поширення.
- Патерни конкурентності — пули робітників, fan-out/fan-in, конвеєри.
- Обмежена конкурентність — семафори на каналах, збирання результатів,
sync.Map. - Довгоживучі горутини —
recoverу кожній горутині, тікери, дренаж під час зупинки.
Текст, час і дані¶
- Рядки, байти та руни —
strings,bytesі чомуlenрахує байти. - Форматування через
fmt— дієслова, ширина й точність,Stringer,%w. - Регулярні вирази —
regexp, іменовані групи і чого немає в RE2. - Час — еталонний макет, тривалості, часові пояси,
Equalзамість==. - Сортування —
slices.SortFunc,cmp.Compare,cmp.Or, стабільність. - Ітератори — написання
iter.Seq, контрактyield,iter.Pull. - Кодування JSON — теги,
omitempty,RawMessage, власна серіалізація. - XML, CSV та рефлексія — потік токенів,
csv, теги структур під час виконання.
Операційна система¶
- Файли та шляхи —
os,filepath,WalkDir, перевірка помилок замість шляхів. - Читачі та письменники —
io.Copy,bufio.Scannerі його ліміт у 64 КБ. go:embed— файли всередині бінарника,embed.FS,all:,fs.Sub.- Прапорці та середовище —
flag, підкоманди,LookupEnv, коди виходу. - Запуск зовнішніх команд —
exec.CommandContext,ExitError, без shell. - Сигнали та коректна зупинка —
NotifyContext, дренаж у межах бюджету. - Хешування та випадкові значення — sha256, HMAC,
crypto/rand, base64, gzip.
HTTP через net/http¶
- HTTP-сервер — обробники, маршрутизація
ServeMux, таймаути, зупинка. - HTTP-клієнт — чому 404 не є помилкою, закриття тіла, повтори.
- Проміжні обробники — обгортання обробників, відновлення, значення в context.
- Шаблони —
text/templateпротиhtml/templateта контекстне екранування. - Події від сервера (SSE) — стрімінг, flush, відкидання повільних клієнтів.
Бази даних через database/sql¶
database/sql— пул,Scan,ErrNoRows, NULL,rows.Err().- Власні типи колонок —
driver.Valuerтаsql.Scanner. - Транзакції — обгортка на замиканні, відкат при паніці, вкладеність.
- Патерн репозиторію — пакет контрактів, переклад помилок сховища.
Тестування¶
- Пакет
testing—TestXxx,ErrorfпротиFatalf, прапорціgo test. - Табличні тести — зріз випадків,
t.Run,t.Parallel. - Хелпери, фікстури та golden-файли —
t.Helper,t.TempDir,testdata/. - Фейки та заглушки — заглушки на функційних полях, підміна годинника.
- Тестування HTTP — рекордери та сервери
httptest. - Бенчмарки, фазинг і детектор гонитв —
b.Loop,f.Fuzz,-race.
Архітектура та домовленості¶
- Зв'язування та структура пакетів —
cmd/,internal/, інʼєкція через конструктор. - Context як носій значень — неекспортовані ключі,
WithoutCancel, чого туди не класти. - Патерни конфігурації — одна структура, значення за замовчуванням, валідація через
errors.Join. - Напрямок залежностей — який пакет що може імпортувати і чому.
- Збірка, кодогенерація та cgo — теги збірки,
-ldflags, крос-компіляція, ціна cgo. - Домовленості проєкту — обгортання помилок, рівні логування, іменування, коментарі.
Спостережуваність¶
- Структуроване логування через
slog— хендлери,With,LogValuer, тестування логів. - Профілювання через pprof — профілі CPU та heap, flat проти cum, flame-графи.
Сторонні бібліотеки¶
Усе, що потрапляє в go.mod. Решта книги — це мова та її стандартна
бібліотека; цей розділ — набір рішень одного конкретного стека.
- Вибір та управління залежностями — оцінка модуля,
go mod tidy,GOPRIVATE,govulncheck. - Налаштування golangci-lint —
depguard,forbidigo, контроль архітектури. golang.org/x/syncтаx/time—errgroup,SetLimit, обмежувачі частоти.- YAML та TOML —
yaml.v3,go-toml, сувора десеріалізація. - viper — багатошарова конфігурація і чому самого
AutomaticEnvзамало. - pgx та PostgreSQL — рідні типи,
PgError,CollectRows, UUIDv7. - Основи GORM — моделі, теги, хуки і пастка нульового значення.
- Запити та транзакції в GORM — ланцюжки, сирий SQL, транзакції в context.
- Міграції через goose — SQL-міграції, вбудовування, безпечні зміни схеми.
- Fiber — обробники v3, біндинг і ціна fasthttp.
- templ — скомпільовані HTML-компоненти з перевіркою типів.
- testify —
assertпротиrequire, діфи, nil проти порожнього. - testcontainers — справжня база даних на тестовий бінарник.
- Prometheus та OpenTelemetry — метрики, трейси, кардинальність.
- Заплановані задачі — gocron плюс advisory-локи для запуску рівно один раз.
- Об'єктне сховище та кешування — S3, valkey і мʼяка деградація.
- OIDC та OAuth — code flow, PKCE, сесії, API-токени.
- MCP-сервери через mcp-go — інструменти, обробники, транспорти.
Джерела¶
- Репозиторій з вихідним кодом: https://github.com/oduvan/learn-go-from-python.
- Наприкінці кожного конспекту перелічені офіційні джерела, з якими було звірено матеріал — як правило, go.dev, pkg.go.dev або специфікація Go.