Установка Go и первый запуск

Go (или Golang) - это современный язык программирования, созданный в Google. Он простой, быстрый и отлично подходит для создания веб-сервисов.

Установка Go

Выбери свою ОС:

# Через Homebrew (рекомендуется)
brew install go

# Или скачайте .pkg с официального сайта: https://go.dev/dl/
# Из репозитория Ubuntu/Debian - просто, но версия обычно отстаёт
# на год-полтора. Для учёбы сгодится, для работы лучше архивом.
sudo apt update
sudo apt install golang-go

# Архивом с официального сайта - всегда актуальная версия.
# Номер посмотри на https://go.dev/dl/ (первая в списке) и подставь:
GO_VERSION=1.XX.X

wget https://go.dev/dl/go${GO_VERSION}.linux-amd64.tar.gz
sudo rm -rf /usr/local/go   # старую версию надо снести, а не распаковать поверх
sudo tar -C /usr/local -xzf go${GO_VERSION}.linux-amd64.tar.gz
export PATH=$PATH:/usr/local/go/bin

Версия здесь не написана намеренно: Go выпускает релиз раз в полгода, и любое конкретное число в туториале протухнет раньше, чем ты его прочитаешь. Заодно rm -rf /usr/local/go перед распаковкой - официальная инструкция, без него файлы двух версий смешиваются и go version показывает неправду.

  1. Скачайте установщик с официального сайта
  2. Запустите .msi файл
  3. Следуйте инструкциям установщика

Если ты пишешь backend «как на сервере» - поставь WSL2 + Ubuntu и используй команды из вкладки Linux.

После установки откройте новый терминал и выполните:
go version

Вы должны увидеть что-то вроде: go version go1.25.0 darwin/arm64 - конкретные числа будут свои, важно, что команда вообще отвечает и не пишет command not found.

Настройка окружения

Настраивать почти нечего: с версии 1.16 Go работает через модули, и проект живёт в любой папке, где тебе удобно. Никакого обязательного каталога нет.

GOPATH при этом никуда не делся, но занимается другим: в нём лежит кеш скачанных зависимостей и бинарники, которые ты ставишь через go install. По умолчанию это ~/go, и трогать его не нужно.

Единственное, что стоит добавить в ~/.bashrc или ~/.zshrc - путь к этим бинарникам, иначе установленные утилиты не запустятся по имени:

export PATH=$PATH:$(go env GOPATH)/bin

Подробнее про GOPATH, GOROOT и go env - в уроке Переменные среды и Go-модули.

Статьи и ответы на StackOverflow старше 2019 года требуют складывать код строго в `$GOPATH/src/github.com/username/project`. До появления модулей это было единственным способом разрешать импорты.

Сейчас это не нужно и мешает: внутри GOPATH некоторые версии Go до сих пор ведут себя иначе. Создавай проект где угодно и начинай с go mod init.

Редактор кода

Писать Go можно хоть в «Блокноте», но не нужно. Go-плагин к редактору - это не украшение: он подключает gopls, официальный языковой сервер от команды Go. Тот же gopls знает про типы, находит определения и подсвечивает ошибки до запуска. Разница ощутимая: без него опечатку в имени поля ты увидишь после go run, с ним - сразу подчёркиванием.

Поставь редактор сейчас, до первой программы, чтобы весь дальнейший курс писать в нормальных условиях.

VS Code

Бесплатный, лёгкий, официальное расширение. Для старта - лучший вариант.

Ctrl+Shift+X (⌘+Shift+X на macOS) → поиск "Go" → расширение от Go Team at Google → Install

После установки открой любой .go файл: расширение само предложит доустановить инструменты (gopls, dlv, staticcheck) - соглашайся, это одна кнопка.

Что появится сразу:

  • автодополнение и подсказки по стандартной библиотеке;
  • F12 - переход к определению функции, Shift+F12 - все места использования;
  • ошибки подчёркиваются во время набора, а не после запуска;
  • форматирование при сохранении - код автоматически приводится к стилю Go;
  • кнопки run test прямо над тестами (пригодится в уроке Тестирование).

Одна настройка, которую стоит включить руками. Открой settings.json (Ctrl+Shift+P → «Preferences: Open User Settings (JSON)») и добавь:

{
  "editor.formatOnSave": true,
  "gopls": {
    "formatting.local": ""
  },
  "[go]": {
    "editor.defaultFormatter": "golang.go",
    "editor.codeActionsOnSave": {
      "source.organizeImports": "explicit"
    }
  }
}

organizeImports при сохранении сам добавит недостающий импорт и уберёт лишний. В Go это не мелочь: неиспользованный импорт - ошибка компиляции, а не предупреждение. Без этой настройки ты будешь ловить её постоянно.

В Go нет споров о табах и пробелах: есть `gofmt`, и он один. Любой Go-код в любом проекте выглядит одинаково, потому что его отформатировала одна и та же программа. Включив `formatOnSave`, ты просто перестаёшь думать об этом навсегда.

Другие редакторы

<ComparisonTable data={{ headers: ["Редактор", "Плюсы", "Минусы"], rows: [ ["VS Code", "Бесплатный, лёгкий, официальное расширение", "Не полноценная IDE"], ["GoLand", "Мощный рефакторинг, отладка и профилировщик из коробки", "Платный, тяжёлый"], ["Vim/Neovim", "Быстрый, терминальный, тот же gopls через LSP", "Настраивать дольше"] ] }} />

GoLand бесплатен для студентов и open source. Vim/Neovim подключают gopls через встроенный LSP-клиент или плагин fatih/vim-go - если ты уже живёшь в Vim, ничего нового объяснять не нужно.

Тонкую настройку окружения - go env, GOPATH, GOPRIVATE, кеш модулей, линтеры - разберём отдельно в уроке Переменные среды и Go-модули, когда появится, что настраивать.

Первая программа

Создайте файл hello.go:

package main

import "fmt"

func main() {
    fmt.Println("Привет, мир!")
}

<CodeBlock language="go" title="hello.go" showRun={true}

package main

import "fmt"

func main() { fmt.Println("Привет, мир!") }

Запуск программы

У вас есть два способа запустить программу:

go run

Компилирует и сразу запускает программу:

go run hello.go
# Вывод: Привет, мир!

go build

Компилирует программу в исполняемый файл:

go build hello.go
./hello
# Вывод: Привет, мир!

<ComparisonTable data={{ headers: ["Команда", "Что делает", "Когда использовать"], rows: [ ["go run", "Компилирует и запускает", "Разработка и тестирование"], ["go build", "Создает исполняемый файл", "Финальная сборка"], ] }} />

Структура Go программы

Каждая Go программа состоит из:

  1. package main - точка входа программы
  2. import - подключение библиотек
  3. func main() - главная функция
- Go чувствителен к регистру - Фигурная скобка `{` должна быть на той же строке, что и объявление функции - Неиспользуемые импорты вызывают ошибку компиляции

Практическое задание

Модифицируйте программу, чтобы она:

  1. Спрашивала имя пользователя
  2. Выводила персональное приветствие
Подсказка

Используйте пакет fmt для чтения ввода:

var name string
fmt.Print("Введите ваше имя: ")
fmt.Scan(&name)  // & означает «адрес переменной» - указатели разберём позже, пока просто используй этот синтаксис
fmt.Println("Привет,", name)

Мини-задание

  • Проверь версию: go version. Она должна совпадать с той, что в go.mod твоих будущих проектов
  • Посмотри, где Go хранит свои вещи: go env GOROOT GOPATH GOMODCACHE GOCACHE
  • Сравни два способа запуска: go run main.go и go build. После build в папке появился файл, после run - нет. Найди, куда run положил бинарник (подсказка: GOCACHE)
  • Запусти go help build и найди флаг, который печатает выполняемые команды
  • Скопируй собранный бинарник на машину без Go и запусти. Он работает: Go собирает статически

Итоги

Теперь вы умеете:

  • ✅ Устанавливать Go
  • ✅ Запускать программы с go run
  • ✅ Создавать исполняемые файлы с go build
  • ✅ Понимать базовую структуру Go программы
  • ✅ Работать в редакторе с автодополнением и проверкой ошибок

Готовы двигаться дальше? В следующем уроке мы изучим переменные и типы данных!

Типичная ошибка

Писать проект в $GOPATH/src «по старой памяти». В мире модулей это не обязательно - создавай проект в любой папке и начинай с go mod init.

Мини-практика

Создай папку hello, выполни go mod init hello, напиши main.go с fmt.Println("Hello, BackendStart!"), затем запусти go run ..

Зарегистрируйтесь бесплатно, чтобы пройти квиз, вести прогресс.