Старт: 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 golang | linux-серверы, проверь версию, не древняя ли |
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 work | workspaces для одновременной работы над несколькими модулями |
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-коуча.
Оплата пока не подключена: премиум и курсы открываются промокодом.