Хочете швидко підняти повноцінне локальне середовище для Go у Linux і більше не ламати голову над змінними середовища, модулями та тестами? Ви в правильному місці! Я — Kernelka, і зараз покажу, як безпечно й чисто все налаштувати: від встановлення Go до налагодження з Delve та автотестів з покриттям. Усе робимо в термінал Linux із чіткими кроками та зрозумілими поясненнями 🐧

Що встановити: Go, Git і базові інструменти

Для стабільного старту нам потрібні Git, компілятор та кілька утиліт. Це базові linux команди через apt команди:

sudo apt update
sudo apt install -y build-essential git curl tar

Варіант 1 (рекомендований): офіційний tarball з go.dev

Так ви отримаєте найновішу стабільну версію Go і повний контроль над GOROOT/GOPATH.

# Дізнатися останню версію та завантажити
VER=$(curl -sSL https://go.dev/VERSION?m=text | head -n1)
curl -OL https://go.dev/dl/${VER}.linux-amd64.tar.gz

# Встановити в /usr/local/go (потребує sudo)
sudo rm -rf /usr/local/go
sudo tar -C /usr/local -xzf ${VER}.linux-amd64.tar.gz

# Налаштувати змінні середовища для bash
echo 'export GOROOT=/usr/local/go' >> ~/.bashrc
echo 'export GOPATH=$HOME/go' >> ~/.bashrc
echo 'export PATH=$PATH:$GOROOT/bin:$GOPATH/bin' >> ~/.bashrc
source ~/.bashrc

Варіант 2: через репозиторій дистрибутива (простий)

Швидко, але версія може бути не найсвіжіша.

sudo apt update
sudo apt install -y golang-go

Перевірка встановлення

go version
which go
echo $GOROOT
echo $GOPATH

Якщо go version працює — вітаю, основа готова для Go в Linux і подальша розробка на Linux виглядає райдужно ✨

Go modules, GOPATH і структура проєкту

Сучасні проєкти в Go використовують модулі (Go modules), тож GOPATH лишається для кешу та інструментів. Створімо мінімальний застосунок.

mkdir -p ~/dev/hello && cd ~/dev/hello
go mod init example.com/hello
package main
import "fmt"

func main() {
    fmt.Println(Hello("world"))
}

func Hello(name string) string {
    return "Hello, " + name
}

Додайте залежність і синхронізуйте модуль:

go get github.com/google/uuid@latest
go mod tidy

Запустіть:

go run .

Автотести і покриття 🧪

Go постачається з інструментом тестування. Додайте простий тест:

package main
import "testing"

func TestHello(t *testing.T) {
    got := Hello("gopher")
    want := "Hello, gopher"
    if got != want {
        t.Fatalf("got %q want %q", got, want)
    }
}

Запуск тестів і збір покриття:

# Детальні тести
go test -v

# Усі пакети з покриттям
go test ./... -cover

# Звіт з покриття у файл та HTML
go test -coverprofile=cover.out ./...
go tool cover -func=cover.out
go tool cover -html=cover.out -o cover.html

Порада: використовуйте підхід "table-driven tests" для зручного масштабування кейсів.

Налагодження з Delve

Delve — стандартний дебагер для Go. Встановимо останню версію через модулі (інструмент потрапить у $GOPATH/bin):

go install github.com/go-delve/delve/cmd/dlv@latest

Базовий сценарій налагодження в терміналі:

cd ~/dev/hello
# Запуск з Delve
dlv debug
# У консолі dlv:
# (dlv) b main.Hello
# (dlv) c
# (dlv) p name
# (dlv) q

Віддалене налагодження (headless) — корисно для сервера або інтеграції з IDE:

dlv debug --headless --listen=:2345 --api-version=2 --log

На деяких дистрибутивах Ubuntu потрібен дозвіл на ptrace для attach:

echo 'kernel.yama.ptrace_scope = 0' | sudo tee /etc/sysctl.d/10-ptrace.conf
sudo sysctl --system

Альтернативні способи встановлення та середовища

ASDF (менеджер версій Go)

Коли потрібно тримати різні версії Go для різних проєктів:

git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.14.0
echo '. "$HOME/.asdf/asdf.sh"' >> ~/.bashrc && source ~/.bashrc
asdf plugin add golang https://github.com/asdf-community/asdf-golang.git
asdf install golang latest
asdf global golang latest

Контейнеризоване оточення

Ізольований простір для збірок без засмічення системи:

docker run -it --rm -v "$PWD":/src -w /src golang:latest bash

GUI-спосіб: VS Code + розширення Go

Якщо вам зручніше працювати у вікні, встановіть VS Code і офіційне розширення Go. IDE автоматично підтягне gopls, dlv та інші інструменти, а запуск налагодження здійснюється з панелі Run. Базова конфігурація launch.json для налагодження:

{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Debug Go (dlv)",
      "type": "go",
      "request": "launch",
      "mode": "debug",
      "program": "${workspaceFolder}"
    }
  ]
}

Після першого запуску VS Code запропонує встановити потрібні інструменти. Погоджуйтеся — це швидко й зручно.

FAQ

Go не знаходиться в PATH (command not found)
Перевірте, чи додали шляхи в ~/.bashrc і виконали source ~/.bashrc. Для інших шелів додайте у відповідний конфіг (~/.zshrc тощо).

go: not in GOROOT або дивні помилки імпорту
Встановлюйте Go з офіційного tarball і перевірте GOROOT=/usr/local/go. Для модулів обов’язково запускайте go mod tidy.

Delve не може приєднатися (permission denied)
Увімкніть ptrace, як описано вище, або запускайте налагодження як той самий користувач, що й процес.

go test не бачить файли
Тести виконуються з каталогом пакета. Використовуйте абсолютні шляхи або testing з os.Getwd(), або //go:embed для вбудовування ресурсів.

Повільні завантаження модулів
Спробуйте прямий проксі: GOPROXY=direct GOSUMDB=off go mod download або виберіть найближчий дзеркальний проксі.

Порада від Kernelka

Створіть простий скрипт scripts/dev.sh, щоб автоматизувати рутину (тести, форматування, лінт). Потім запускайте однією командою — менше механічних дій, більше фокусу на коді 🛠️

Підсумок

  • Встановили Go офіційно або через пакетний менеджер і налаштували PATH.
  • Ініціалізували модулі, підключили залежності, запустили застосунок.
  • Додали автотести та сформували звіти з покриття.
  • Освоїли налагодження з Delve в терміналі та у VS Code.
  • Побачили альтернативи: asdf та контейнеризовані середовища.
  • Тепер ваше локальне середовище для Go у Linux повністю готове до роботи!