Перейти к основному содержимому

Go — итоги

Разработчику Аналитику Тестировщику Архитектору Инженеру

Кратко — что стоит унести из раздела "Go". Если пункт кажется туманным — откройте указанную главу или оглавление.


FAQ — Часто задаваемые вопросы

Типичные сбои и ситуации, с которыми сталкиваются новички после раздела. Здесь — что делать и где копать в главах; определения для зачёта — в чек-листе.

Вопрос. go run main.go пишет "package command-line-arguments is not a main package".

Ответ. В каталоге должен быть package main и функция func main(). Запускайте из корня модуля с go.mod или укажите пакет: go run .. Подробнее здесь — первая программа, основы.

Вопрос. Импортировал пакет, а компилятор: "imported and not used".

Ответ. В Go неиспользуемый импорт — ошибка. Удалите импорт или используйте идентификатор (временно _ только если понимаете зачем). Подробнее здесь — основы.

Вопрос. Объявил s := make([]int, 0) и через append получаю странные индексы — slice "режет" не тот массив.

Ответ. Срезы делят общий backing array; append может переаллоцировать, а вложенный slice после [:n] останется ссылаться на старый буфер. Копируйте явно append([]T(nil), s...). Подробнее здесь — основы, синтаксис.

Вопрос. panic: assignment to entry in nil map при первом m["key"] = 1.

Ответ. Нулевая map не готова к записи — нужен make(map[K]V) или литерал map[K]V{}. Чтение из nil map безопасно и вернёт zero value. Подробнее здесь — основы.

Вопрос. Цикл for i, v := range slice — внутри горутины все v одинаковые.

Ответ. До Go 1.22 переменная цикла переиспользовалась; передавайте копию: v := v внутри тела или параметр в go func(v T). Подробнее здесь — синтаксис и конкурентность, паттерны.

Вопрос. Запустил тысячу go func(){...}() — процесс съел всю память.

Ответ. Горутины дешёвые, но не бесплатны при бесконтрольном spawn. Ограничивайте worker pool, используйте семафор или пул через канал. Подробнее здесь — паттерны.

Вопрос. Программа зависла на отправке в канал — deadlock.

Ответ. Небуферизованный канал блокирует, пока нет получателя; закрытый канал при отправке паникует. Проверьте пару send/receive, select и кто закрывает канал. Подробнее здесь — синтаксис и конкурентность.

Вопрос. go mod tidy не находит модуль с GitHub — timeout или 404.

Ответ. Проверьте путь модуля, тег версии, GOPROXY и доступ к сети. Для приватных репозиториев настройте GOPRIVATE и git credentials. Подробнее здесь — основы.

Вопрос. Ошибка cannot find package в подпапке без go.mod.

Ответ. С Go Modules код живёт внутри модуля с go.mod; импортный путь должен совпадать с module + каталог. Выполните go mod init в корне проекта. Подробнее здесь — первая программа.

Вопрос. HTTP-handler паникует, а клиент видит обрыв соединения без JSON-ошибки.

Ответ. В Go нет исключений — паника в handler роняет процесс, если нет recover в middleware. Возвращайте error из логики и мапьте в статус-код. Подробнее здесь — веб на stdlib, Gin.

Вопрос. json.Unmarshal заполнил поля нулями, хотя JSON правильный.

Ответ. Поля struct должны быть экспортируемы (с заглавной буквы) и совпадать по json:"name". Вложенные объекты требуют вложенных struct. Подробнее здесь — основы.

Вопрос. Сравниваю два []byte через == — компилятор не даёт.

Ответ. Срезы сравнивают через bytes.Equal или цикл; == только для массивов фиксированной длины. Подробнее здесь — основы.

Вопрос. Метод с pointer receiver не вызывается у value — "cannot call pointer method".

Ответ. Если метод с *T, у value типа T Go возьмёт адрес, но не наоборот для всех случаев с interface. Согласуйте receivers в типе. Подробнее здесь — синтаксис.

Вопрос. Интерфейс nil, но err != nil всё равно true.

Ответ. Интерфейс хранит тип и значение: конкретный nil-pointer внутри non-nil interface даёт "загадочный" nil. Возвращайте явный nil error без typed nil. Подробнее здесь — синтаксис.

Вопрос. defer изменил переменную не так, как ожидал в цикле.

Ответ. Аргументы defer вычисляются в момент регистрации, выполнение — при выходе из функции. В цикле передавайте копии в defer f(x). Подробнее здесь — синтаксис.

Вопрос. Тест go test падает только на CI, локально зелёный.

Ответ. Частые причины — гонки (-race), другая версия Go, зависимость от порядка выполнения тестов или таймингов. Запустите go test -race ./.... Подробнее здесь — основы.

Вопрос. gofmt переставил импорты — это "ломает" стиль команды?

Ответ. Единый gofmt/goimports — норма в Go-сообществе; споры о форматировании не ведут. Настройте format on save в IDE. Подробнее здесь — основы.

Вопрос. Gin возвращает 404, хотя маршрут в коде есть.

Ответ. Проверьте метод HTTP, trailing slash, группу роутов и порядок middleware. NoRoute перехватывает только несовпавшие пути. Подробнее здесь — Gin.

Вопрос. gRPC клиент: "connection refused" при localhost.

Ответ. Сервер должен слушать тот же порт и протокол; для TLS — совпадение credentials. Сгенерированный код из .proto должен совпадать с версией на сервере. Подробнее здесь — gRPC.

Вопрос. Дженерик-функция: "type X does not satisfy constraint".

Ответ. Ограничение (constraints.Ordered, свой interface) должно выполняться всеми type arguments. Упростите constraint или добавьте методы в тип. Подробнее здесь — дженерики.

Вопрос. Профилировщик pprof показывает пустой CPU profile.

Ответ. Нужна нагрузка во время сбора и импорт _ "net/http/pprof" с HTTP endpoint или правильный go test -cpuprofile. Подробнее здесь — профилирование.

Вопрос. WebSocket отключается через минуту за прокси.

Ответ. Настройте ping/pong, таймауты и заголовки Upgrade на балансировщике. Подробнее здесь — WebSocket.

Вопрос. Cobra: подкоманда не видит флаг из root.

Ответ. Флаги привязаны к конкретной Command; пробросьте PersistentFlags или определите флаг на родителе. Подробнее здесь — CLI cobra/viper.

Вопрос. Путаю := и = — "no new variables on left side of :=".

Ответ. := объявляет хотя бы одну новую переменную в блоке; для присваивания уже объявленным используйте =. В package level только var. Подробнее здесь — основы.

Вопрос. Пришёл из Java/Python и жду исключений try/catch.

Ответ. Идиома Go — возвращать (T, error) и проверять if err != nil. panic оставьте для невосстановимых сбоев. Подробнее здесь — синтаксис, паттерны.

Вопрос. Собрал бинарник на Windows, на Linux "Exec format error".

Ответ. Нужна кросс-компиляция: GOOS=linux GOARCH=amd64 go build. Обычный build таргетит текущую ОС. Подробнее здесь — основы.

Вопрос. Не знаю, с чего начать в разделе — сразу Kubernetes или Gin?

Ответ. Сначала первая программа и основы, затем один углублённый трек из оглавления: stdlib HTTP, Gin или CLI. Инфраструктурные проекты на Go приходят после понимания модулей и ошибок.

Вопрос. Go или Golang — как правильно называется язык?

Ответ. Официально язык называется Go; "Golang" — неформальное имя (в т.ч. домен golang.org). В документации и вакансиях встречаются оба варианта. Подробнее здесь — о разделе, основы.

Вопрос. Как установить Go на Windows 10/11 и проверить установку?

Ответ. Скачайте MSI с go.dev, добавьте GOROOT/PATH, выполните go version. Первый проект — go mod init и go run. Подробнее здесь — первая программа.

Вопрос. Go vs Python для backend — что выбрать?

Ответ. Go даёт один статический бинарник, быстрый старт и встроенную конкурентность; Python — богатая ML/скриптовая экосистема. Для микросервисов и DevOps-утилит Go часто предпочтительнее. Подробнее здесь — о разделе, Gin.

Вопрос. Go vs Java — в чём разница для новичка?

Ответ. Go проще синтаксис, нет JVM и исключений, зато нет generics-истории до 1.18 и меньше enterprise-фреймворков "из коробки". Подробнее здесь — основы, синтаксис.

Вопрос. Что такое goroutine простыми словами?

Ответ. Легковесный поток выполнения, запускаемый через go f(); планировщик Go мультиплексирует их на OS-потоках. Обмен данными — через каналы. Подробнее здесь — синтаксис и конкурентность.

Вопрос. Как написать REST API на Go с нуля?

Ответ. Начните с net/http в веб на stdlib, затем фреймворк Gin и контракты из REST обзора. Подробнее здесь — маршрут в intro.

Вопрос. go mod init — зачем нужен go.mod?

Ответ. Файл объявляет имя модуля и версию Go; зависимости фиксируются в go.sum. Заменяет старый GOPATH для проектов. Подробнее здесь — первая программа, основы.

Вопрос. Сколько учить Go до первой работы junior?

Ответ. При базе программирования 1–2 месяца на синтаксис, модули, HTTP и тесты плюс пет-проект. Конкурентность и прод-паттерны — дольше. Подробнее здесь — оглавление, чек-лист.

Вопрос. Kubernetes написан на Go — нужно ли учить Go DevOps-инженеру?

Ответ. Для кастомных операторов, CLI и контрибуций — да; для базового kubectl/Helm достаточно YAML и концепций оркестрации. Go полезен для утилит. Подробнее здесь — о разделе.

Вопрос. Обработка ошибок в Go без try catch — как правильно?

Ответ. Идиома if err != nil { return err }; оборачивание через %w и errors.Is/As. Подробнее здесь — синтаксис, паттерны.

Вопрос. Slice и array в Go — в чём разница?

Ответ. Array фиксированной длины; slice — дескриптор над массивом с len и cap. В API чаще slice. Подробнее здесь — основы.

Вопрос. Gin framework Go tutorial на русском — где начать?

Ответ. В разделе: Gin после основ и первой программы. Подробнее здесь — оглавление.

Вопрос. gRPC на Go — как поднять сервис?

Ответ. Опишите .proto, сгенерируйте код, реализуйте сервер и клиент на google.golang.org/grpc. Подробнее здесь — gRPC.

Вопрос. Дженерики в Go 1.18 — нужны ли начинающему?

Ответ. После базы типов и интерфейсов; для алгоритмов на []T и map удобны type parameters. Подробнее здесь — дженерики.

Вопрос. go test — как писать unit-тесты в Go?

Ответ. Файл *_test.go, функции TestXxx(t *testing.T), запуск go test ./.... Табличные тесты — идиома сообщества. Подробнее здесь — основы.

Вопрос. Профилирование Go приложения pprof — с чего начать?

Ответ. CPU и heap profile через net/http/pprof или go test -cpuprofile. Подробнее здесь — профилирование.

Вопрос. Cobra CLI на Go — как сделать консольную утилиту?

Ответ. Структура command/subcommand, флаги и конфиг через viper. Подробнее здесь — CLI cobra/viper.

Вопрос. Зарплата Go-разработчика в России — востребован ли язык?

Ответ. Спрос стабилен в backend, infra и продуктовых компаниях с микросервисами; точные цифры зависят от города и стека. Навыки из раздела — микросервисы, Gin.

Вопрос. WebSocket сервер на Go — есть ли в стандартной библиотеке?

Ответ. Да, golang.org/x/net/websocket и пакеты вроде gorilla/websocket; в разделе — обзор практики. Подробнее здесь — WebSocket.

Вопрос. Кросс-компиляция Go под Linux с Windows — как?

Ответ. set GOOS=linux и set GOARCH=amd64, затем go build (в PowerShell — $env:GOOS="linux"). Подробнее здесь — основы.

Вопрос. Go для начинающих с нуля — бесплатный курс на русском?

Ответ. Этот раздел энциклопедии: первая программаосновычек-лист. Подробнее здесь — оглавление.

Вопрос. interface и any в Go — что использовать?

Ответ. С Go 1.18 алиас any = interface{}; предпочитайте конкретные типы и generics, any — для JSON и рефлексии. Подробнее здесь — дженерики, основы.

Вопрос. Docker написан на Go — надо ли знать Go для контейнеров?

Ответ. Для использования Docker — нет; для написания плагинов и инструментов вокруг контейнеров Go ускоряет вход. Подробнее здесь — о разделе.


Что запомнить

Go (или Golang) — это компилируемый, статически типизированный язык программирования, разработанный в Google для создания надёжных, эффективных и масштабируемых систем. Он сочетает простоту синтаксиса, высокую производительность и встроенную поддержку конкурентности, что делает его популярным выбором для бэкенд-разработки, микросервисов, CLI-инструментов и облачной инфраструктуры.

Основные особенности Go:

  • Минималистичный синтаксис — отсутствие наследования, исключений, перегрузки функций, шаблонов — всё ради простоты и предсказуемости;
  • Строгая статическая типизация с выводом типа через :=;
  • Сборка мусора: автоматическое управление памятью без ручного освобождения;
  • Встроенная конкурентность: горутины и каналы как основные примитивы параллелизма;
  • Быстрая компиляция: проекты собираются за секунды даже при большом объёме кода;
  • Единый исполняемый файл: результат компиляции не требует внешних зависимостей;
  • Отличная стандартная библиотека — HTTP-сервер, JSON, шифрование, тестирование, маршрутизация — всё "из коробки";
  • Поддержка кросскомпиляции: сборка под любую ОС и архитектуру без дополнительных инструментов.
  • Дженерики (Go 1.18+): type parameters и constraints — отдельная статья.
  • gRPC и CLI: protobuf-сервисы (gRPC в Go), cobra/viper (CLI на cobra и viper).
  • Профилирование — pprof, trace, fuzz — Профилирование, trace и fuzz в Go.
  • WebSocket и observability: WebSocket в Go, Prometheus в Веб на стандартной библиотеке Go.

Области применения Go:

  • Веб-сервисы и API — благодаря встроенному HTTP-стеку и фреймворкам (Gin, Echo, Fiber);
  • Микросервисы и облачные приложения — Kubernetes, Docker, Prometheus, Terraform — все написаны на Go;
  • Инструменты DevOps и CLI-утилиты: лёгкость развёртывания и отсутствие зависимостей;
  • Высоконагруженные системы: обработка тысяч запросов в секунду с низкой задержкой;
  • Сетевые приложения — TCP/UDP-серверы, прокси, брокеры сообщений.

Экосистема Go включает:

  • go toolchain — компилятор, менеджер пакетов, тестовый фреймворк, профилировщик;
  • Go Modules: система управления зависимостями, встроенная с версии 1.11;
  • gofmt: форматирование кода по единому стандарту без обсуждений;
  • vet, lint, staticcheck: инструменты анализа качества кода;
  • Delve: мощный дебаггер для Go-приложений.

Три основных правила эффективной работы с Go:

  1. Следовать идиоматическому стилю — использовать errors вместо исключений, избегать глобальных переменных, предпочитать композицию наследованию;
  2. Писать тестируемый код: каждая функция должна покрываться unit-тестами (*_test.go);
  3. Не усложнять — если решение выглядит громоздко, вероятно, оно нарушает дух языка.

Три фундаментальных момента:

  • Go — это язык, где простота важнее выразительности;
  • Его сила — в консистентности, скорости разработки и надёжности в продакшене;
  • Знание модели конкурентности (goroutines + channels) критически важно для раскрытия потенциала языка.

Куда идти дальше

ТемаРаздел
"Kotlin — о разделе""Kotlin — о разделе"
"Ruby — о разделе""Ruby — о разделе"
"Smalltalk — о разделе""Smalltalk — о разделе"
"Groovy — о разделе""Groovy — о разделе"

Проверьте себя: Чек-лист самопроверки.


Основа по протоколу

Базовый разбор HTTP и HTTPS находится в отдельной статье — HTTP как основа веб-интеграций.