От первой программы к проверяемой функции
Один проект на весь путь
Вы напишете сервис фоновых заданий. Клиент отправляет текст, сервер выдаёт номер задания, а обработчик возвращает текст в верхнем регистре и число слов. Сначала обработаем одну строку обычной функцией. Затем добавим HTTP, несколько обработчиков, восстановление после перезапуска, повторы и измерения под нагрузкой.
Все восемь этапов, стартовый проект и эталон доступны бесплатно. Нужны компьютер, редактор, терминал и Go 1.25; для скачивания нужен интернет. Облако, Docker, платные API и опыт коммерческой разработки не требуются. Время в начале главы относится к чтению: практика может занять несколько подходов. Это учебный сервис для локального запуска; готовность к работе с реальными данными отдельно проверяют по требованиям конкретной системы.
Если вы раньше не программировали
Пройдите «Основы Go» по порядку: первая программа, переменные, условия и циклы, функции, указатели, коллекции, структуры, интерфейсы, ошибки, обобщения, пакеты, модули и первый тест, введение в горутины. Упражнение на обобщения можно отложить: в этом проекте оно не понадобится.
После каждой главы сначала решите её упражнение. Переходите к проекту, когда можете написать функцию со структурой результата, обработать ошибку и запустить свой тест. Если эти действия пока не получаются, вернитесь к соответствующей главе; возраст сам по себе не определяет готовность.
Подготовьте рабочую папку
Скачайте стартовый проект, распакуйте его в отдельную папку и откройте её в редакторе. В терминале перейдите в папку, содержащую go.mod. Например:
go version
cd "путь к папке/backend-path-starter"
go test ./... -run '^TestStage01' -count=1Замените путь своим; кавычки позволяют использовать пробелы в имени папки. В Windows эти команды можно выполнить в PowerShell. go.mod уже есть в архиве: второй go mod init здесь не нужен. В собственном пустом проекте модуль создают командой go mod init example.com/go-study, как в основном курсе.
Стартовый код содержит объявления и заглушки TODO. Он должен компилироваться, но тест текущего этапа сначала падает. Не запускайте все будущие этапы как критерий сегодняшней работы: они проверяют функции, которые вы ещё не написали. Редактируйте исходники, а не ожидаемые значения проверок.
Напишите Analyze
Откройте internal/jobs/jobs.go: пакет jobs содержит Analyze(text) и структуру Result. Точка входа сервера находится отдельно, в cmd/server/main.go. Не переносите эти объявления в main: сервер уже импортирует пакет обработки. Поле Text содержит strings.ToUpper(strings.TrimSpace(text)), а Words — длину strings.Fields(text). Словом здесь считается последовательность символов между пробельными разделителями: знаки препинания отдельно не очищаются. Это договор функции, а не универсальный лингвистический анализатор.
Для входа " hello go " результат должен содержать Text: "HELLO GO" и Words: 2. Пробелы внутри текста сохраняются, хотя подсчёт слов их группирует. Для пустой строки и строки из пробелов получается пустой текст и ноль слов.
Напишите реализацию и собственный табличный тест минимум на эти три случая. Добавьте файл internal/jobs/own_test.go, начните его с package jobs, подключите testing и назовите тест, например, TestStage01OwnAnalyze(t *testing.T). Внутри этого пакета вызывайте Analyze без префикса. В дальнейшем начинайте имена собственных тестов с номера текущего этапа (TestStage02... и так далее): тогда команды главы запускают и их. Файл с суффиксом _test.go нужен для тестирования, в сервер он не включается. Объявления функций и типов размещайте вне main; вызовы, циклы и присваивания — внутри функций. Стандартные пакеты подключаются через import, устанавливать библиотеку strings отдельно не нужно.
Проверьте
go test ./... -run '^TestStage01' -count=1
go build ./...Временно замените подсчёт слов на константу 1, убедитесь, что проверка падает, и восстановите реализацию. Прочитайте ожидаемое и фактическое значения в сообщении. Зелёный тест полезен, только если он умеет заметить ошибку.
Частые ошибки: считать пробелы вместо слов; удалить все внутренние пробелы; запускать команду из родительской папки без go.mod; добавить второй main вместо изменения функции. Сначала исправляйте первую ошибку компилятора — остальные могут быть её следствием.
Когда идти дальше
Объясните без запуска, что вернёт функция для "Go\nHTTP" и почему "hello, go!" содержит два слова. Ответы: Text равен "GO\nHTTP", число слов — два; запятая и восклицательный знак остаются частью слов.
Тест этапа проверяет поведение функции. Он не проверяет, что вы поняли структуры, функции и модуль. Если можете объяснить свой код и самостоятельно добавить случай, переходите к HTTP API.
Самопроверка этапа
Отмечайте результат после своей проверки. Открытие главы ничего не завершает. Отметки сохраняются в этом браузере и не являются независимой аттестацией.
Для завершения отметьте все критерии и добавьте объяснение.