Раздел 22 · Go

Старт: Tour of Go, toolchain, первый репозиторий

junior~45 мин

без входаВойди, чтобы отмечать прогресс, вести заметки и решать задачи в редакторе. войти

Старт: Tour of Go, toolchain, первый репозиторий

Этот урок ставит рамку перед всеми остальными в разделе. Прошёл его, и у тебя на ноуте стоит Go, настроен редактор, лежит публичный репозиторий с табличным тестом и зелёным go test ./.... Дальше идёт идиоматика (02-idioms-and-stdlib) и воркшоп (01-weather-cli).

Стиль уроков по Go в этом курсе ровный: короткие секции, рантаймовые сниппеты, минимум воды. За референсом по подаче можно следить у Антона Жижанова, там же лежит интерактивный cheatsheet и обзоры релизов.

0. Где Go хорош и где не очень

Go это серверный язык без бойлерплейта. Его пишут там, где важны:

  • Сервисы и сетевой I/O. HTTP, gRPC, очереди, прокси. Стандартная библиотека закрывает 80% задач, не требуя внешних зависимостей.
  • CLI и инфра. kubectl, terraform, docker, caddy. Компилируется в один статический бинарь, кросс-компилируется одной строкой.
  • Конкурентные пайплайны. Горутины и каналы, плюс errgroup, закрывают подавляющее большинство нужд по concurrency.

Чего не стоит ждать: продвинутой системы типов как в Rust или Haskell, богатой экосистемы UI, тонкого контроля памяти. Generics есть с 1.18, но они скромные. Это сознательная сделка авторов языка: меньше способов сделать одно и то же, проще читать чужой код.

1. Установка Go

Один официальный путь, плюс пара удобных альтернатив. Текущая стабильная версия на момент урока, Go 1.24.

СпособКогда использовать
https://go.dev/dl/дефолт, ставишь свежий релиз руками
Homebrew (brew install go)macOS, если уже сидишь на brew
apt install golanglinux-серверы, проверь версию, не древняя ли
gvm или gесли работаешь с проектами на разных версиях
Docker (golang:1.24-alpine)для CI, для воспроизводимых сборок

Проверь, что всё встало:

go version
# go version go1.24.x darwin/arm64

GOROOT (где лежит сам Go) и GOPATH (старая глобальная workspace), для модулей не важны: с 1.16 Go-modules включены по умолчанию. Не правь их без причины. Единственное, что стоит проверить, это что $(go env GOPATH)/bin лежит в $PATH, иначе бинари из go install не будут запускаться.

echo 'export PATH="$PATH:$(go env GOPATH)/bin"' >> ~/.zshrc

2. Tour of Go и code-basics

Tour of Go проходится за один-два вечера. Это интерактивный учебник от команды языка: типы, функции, структуры, интерфейсы, базовые goroutines и channels.

На что не стоит долго залипать на первом проходе:

  • Generics-главу (последний модуль). Понять идею, не вгрызаться в тонкости constraints. К ним вернёшься, когда возьмёшься за свои библиотеки.
  • Concurrency-главу до конца. Идею goroutines и channels уловить обязательно, но select и буферизованные каналы лучше углубить отдельно в 04-concurrency-deep и 15-concurrency-patterns.

К чему вернуться потом: type assertions, embedding, методы с pointer receiver. По-первости они ускользают, обрастают смыслом за две недели практики.

Параллельно можно открыть code-basics: Go, там русские формулировки и упражнения на синтаксис. Полезно тем, кому английский в Tour мешает сосредоточиться на типах.

3. Toolchain в одной таблице

Из 12 ключевых команд go ты будешь использовать каждый день максимум 6. Запомни их сразу:

КомандаЧто делает
go run main.goскомпилировал, запустил, выкинул бинарь
go buildсобрал бинарь в текущую папку
go test ./...прогнал тесты во всех пакетах модуля
go test -race ./...то же самое плюс race detector
go vet ./...статический анализатор от команды Go (strict, обязательный)
gofmt -l -w .форматирование, единственное и обязательное
go mod tidyпривести go.mod и go.sum в порядок (выкинуть лишнее, добавить нужное)
go install <pkg>@latestустановить бинарь сторонней утилиты в GOPATH/bin
go doc <pkg>прочитать локально доку пакета без браузера
go envвывести все переменные окружения тулчейна
go workworkspaces для одновременной работы над несколькими модулями
go generate ./...запустить генераторы (protoc, sqlc, mockery), описанные в //go:generate

Правило: если код не отформатирован gofmt, его не существует. Подключи форматирование на сохранение в редакторе и забудь.

4. Первый модуль и проект

Минимальный модуль это go.mod плюс main.go в корне:

mkdir hello && cd hello
go mod init github.com/USERNAME/hello

В go.mod появляется три строки:

module github.com/USERNAME/hello

go 1.24

Имя модуля совпадает с тем, как другие проекты будут его импортировать. Префикс с git-хостингом, не обязательное правило, но удобное соглашение: если завтра выложишь в open source, ничего не сломается.

Теперь main.go:

package main

import "fmt"

func main() {
    fmt.Println("hello, batschool")
}

Запуск:

go run .
# hello, batschool

Структура для маленького pet-проекта (CLI или сервис):

.
├── go.mod
├── go.sum
├── main.go
├── internal/
│   ├── api/         // обработчики HTTP/gRPC
│   ├── core/        // бизнес-логика
│   └── store/       // адаптеры к БД, файлам, кэшу
└── docs/
    └── README.md

Что важно:

  • Папка это пакет. Файлы из одной папки, один пакет, разделять по файлам не имеет смысла, кроме как из соображений размера.
  • internal/, это правило компилятора. Код снаружи модуля не увидит ничего из internal/. Используй для всего, что не публичный API библиотеки.
  • cmd/ нужен только когда несколько бинарей. Для одного бинаря достаточно main.go в корне. cmd/server, cmd/cli появляются, когда из одного репо собираются две и больше команды.
  • pkg/ обычно лишний. Эта конвенция из старого project-layout не от команды Go и не общепринятая. По умолчанию не используй.
  • Layout по доменам, а не по слоям. В core/ пакет user, в нём весь домен пользователя: типы, ошибки, бизнес-функции. Не services/UserService, repositories/UserRepository. Слои это Java-привычка, в Go она режет глаз.

В уроке 14-pet-architecture разберём архитектурные паттерны (hex-arch, Mat Ryer, DI) глубже. Сейчас достаточно одного правила: пиши плоско, дроби по доменам.

премиум-урок

Продолжение в премиуме: 1 200 ₽ в месяц или 10 000 ₽ в год. Вместе с ним серверные проверки задач и школьные токены AI-коуча.

Оплата пока не подключена: премиум и курсы открываются промокодом.