Запись архива

Как настроить VS Code для Go: модули, gopls, тесты и Delve

Для настройки Go в VS Code установите Go SDK и официальное расширение Go, откройте папку модуля и проверьте инструменты gopls и Delve. SDK собирает и запускает код, gopls обеспечивает анализ в редакторе, а Delve…

Как настроить VS Code для Go: модули, gopls, тесты и Delve

Для настройки Go в VS Code установите Go SDK и официальное расширение Go, откройте папку модуля и проверьте инструменты gopls и Delve. SDK собирает и запускает код, gopls обеспечивает анализ в редакторе, а Delve нужен для отладки.

Создадим маленькое приложение с тестами. Если у вас уже есть проект с go.mod, не запускайте в нём повторную инициализацию и не заменяйте требования к версии языка настройками из учебного примера.

Установите Go SDK

Выберите пакет своей ОС на официальной странице установки Go. Для существующего проекта сначала проверьте директивы go и, если она есть, toolchain в go.mod, а также требования README.

После установки перезапустите VS Code и выполните в терминале:

go version
go env GOROOT GOPATH

Не задавайте GOROOT вручную без конкретной необходимости: обычная установка определяет расположение SDK. Если go не найден, проверьте PATH и путь исполняемого файла через where.exe go в Windows или command -v go в macOS/Linux.

Устанавливать SDK ради VS Code отдельно от SDK терминала не нужно. Важно, чтобы расширение и команды проекта использовали совместимые инструменты, а не случайные разные установки.

Установите расширение и инструменты редактора

В Extensions найдите Go, идентификатор golang.Go, официальный проект команды Go. Откройте файл .go, чтобы расширение активировалось. Если оно предлагает установить недостающие инструменты, проверьте список и подтвердите необходимые компоненты.

В палитре доступна команда Go: Install/Update Tools. Для базового сценария важны gopls и dlv. Не обновляйте инструменты вслепую, если поддерживаете старую версию Go: у расширения и language server есть политика совместимости. Назначение компонентов и поддерживаемые версии указаны в репозитории vscode-go.

gopls и компилятор решают разные задачи. Если подсказки исчезли, это не обязательно мешает go build. И наоборот: красивая подсветка не доказывает успешную сборку.

Создайте первый Go-модуль

Создайте папку go-start, откройте её через File → Open Folder и выполните:

go mod init example.com/go-start

example.com/go-start здесь является учебным путём модуля. Для локального примера регистрировать этот домен или создавать удалённый репозиторий не нужно. Путь определяет пространство импортов, а не обязательное подключение к серверу на этом шаге.

В режиме модулей проект не обязан находиться внутри GOPATH/src. Основной ориентир для этого примера: в корне открытой папки находится go.mod. Создание модуля и запуск программы разобраны в Getting started with Go.

Создайте main.go:

package main

import "fmt"

func totalPrice(price, quantity int) int {
    return price * quantity
}

func main() {
    total := totalPrice(350, 3)
    fmt.Printf("Total: %dn", total)
}

Запустите из корня проекта:

go run .
go build .

Первая команда должна вывести Total: 1050. Вторая создаёт исполняемый файл пакета main; отсутствие ошибок важнее наличия подробного сообщения в терминале. Точка в командах означает текущий пакет, поэтому запуск из другой папки может дать другой результат.

Настройте форматирование

В .vscode/settings.json добавьте:

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

Для проверки измените отступы в main.go и явно сохраните файл. Форматирование Go не следует перекладывать на Prettier-конфигурацию JavaScript. Если задан глобальный форматтер, языковой блок помогает выбрать подходящий инструмент для .go.

Оформление кода и организация импортов являются разными операциями. Если расширение не предлагает импорт, проверьте состояние gopls, корень модуля и возможность найти зависимость. Не добавляйте случайные пути в GOPATH для подавления сообщения редактора. Список функций и настроек можно найти в документации Go для VS Code.

Добавьте тесты

Рядом с main.go создайте main_test.go:

package main

import "testing"

func TestTotalPrice(t *testing.T) {
    if got := totalPrice(350, 3); got != 1050 {
        t.Fatalf("totalPrice = %d, want 1050", got)
    }
}

func TestZeroQuantity(t *testing.T) {
    if got := totalPrice(350, 0); got != 0 {
        t.Fatalf("totalPrice = %d, want 0", got)
    }
}

Выполните:

go test ./...
go vet ./...

Ожидаются успешные тесты и отсутствие диагностик go vet для этого примера. Шаблон ./... распространяет команду на пакеты текущего дерева. Имена тестов начинаются с Test, а файлы заканчиваются на _test.go. Основы тестирования объясняет официальное руководство Add a test.

Для контроля актуального результата при подозрении на кэш можно выполнить go test -count=1 ./.... Не воспринимайте go vet как доказательство отсутствия ошибок: это дополнительная статическая проверка, а не замена тестам поведения.

Настройте отладчик Delve

Создайте .vscode/launch.json:

{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Go: current module",
      "type": "go",
      "request": "launch",
      "mode": "auto",
      "program": "${workspaceFolder}",
      "cwd": "${workspaceFolder}"
    }
  ]
}

Для данного проекта пакет main лежит в корне. Если у реального приложения входная точка в cmd/server, измените program на эту папку, а рабочий каталог выбирайте с учётом файлов конфигурации приложения.

Поставьте точку останова внутри totalPrice, нажмите F5 и посмотрите аргументы. Если не найден dlv, установите Delve через Go: Install/Update Tools. Не заменяйте его отладчиком C++: для Go используется другой адаптер. Варианты конфигурации описаны в официальном руководстве vscode-go по отладке.

Как разбирать проблемы окружения

Выполните из папки проекта:

go env GOMOD GOWORK

Для простого проекта GOMOD должен указывать на его go.mod. GOWORK помогает заметить влияние workspace-файла, если вы работаете с несколькими модулями. Для однопроектного примера специально создавать go.work не нужно.

Симптом Первая проверка
go.mod file not found Открыта ли папка модуля, откуда выполняется команда
Сборка работает, подсказок нет Запущен ли gopls; журнал Go в Output
F5 сообщает об отсутствующем dlv Установлен ли Delve и доступен ли расширению
Ошибка скачивания модуля Сеть, proxy и доступ к репозиторию зависимости
Требуется более новая Go Требования проекта и совместимость toolchain
main redeclared Нет ли нескольких main в одном пакете

Не выключайте проверку модулей и не меняйте глобальные переменные Go только для исчезновения сообщения. Сначала прочитайте полный текст ошибки и проверьте локальную конфигурацию. В существующем проекте также не запускайте go mod tidy как универсальный ремонт без просмотра последующего diff: эта команда меняет описание зависимостей.

Настройка закончена, когда приложение запускается, оба теста проходят, форматирование воспроизводится и отладчик останавливается в нужной функции. Сохраните конфигурацию и go.mod в Git, исключив ненужные бинарные файлы сборки.