Go (часто называют Golang) — это современный компилируемый язык программирования от Google, который славится своей простотой, высокой производительностью и отличной поддержкой конкурентности (горутины). Он идеально подходит для создания веб-серверов, сетевых утилит, облачных приложений и CLI-инструментов. Сложность установки на Debian в том, что версия в официальных репозиториях (apt) может быть сильно устаревшей: на Debian 11 это Go 1.15 (вышел в 2020 году), на Debian 12 — Go 1.19 (2022 год). Разработчикам часто нужна более свежая версия, а установка из tarball или исходников требует настройки переменной PATH.
💡 В этом руководстве мы разберём три способа установки Go на Debian: через APT (проще всего, но версия старше), из официального tarball (рекомендованный способ для разработчиков) и сборку из исходников (для энтузиастов, которым нужно патчить сам компилятор). Вы также узнаете, как настроить PATH, проверить установку на тестовой программе и решить типичные проблемы.
В этой статье вы узнаете:
- Какой способ установки выбрать в зависимости от ваших задач
- Как установить Go через APT (для консервативных пользователей)
- Как установить Go из официального tarball (актуальная версия с проверкой SHA256)
- Как собрать Go из исходников (для тех, кто патчит компилятор)
- Как настроить PATH для tarball и source-сборок
- Как создать скрипты для удобного обновления
- Как проверить установку на тестовой программе
- Как решить типичные проблемы: конфликт версий,
go: command not found, отсутствиеgcc
Для кого: разработчики на Go, системные администраторы, которые компилируют Go-проекты, а также все, кому нужна актуальная версия Go на Debian 11, 12 или 13.
1. 🔧 Предварительные требования
Перед установкой убедитесь, что:
- У вас установлена Debian 11, 12 или 13
- Подключение к интернету стабильно
- Вы знаете, нужна ли вам самая свежая версия Go или достаточно версии из репозитория
⚠️ ВАЖНО: Проверьте права sudo перед установкой
Если вы не уверены, есть ли у вашего пользователя права администратора, выполните в терминале:
sudo whoami
Что делает: sudo выполняет команду от имени суперпользователя, whoami показывает имя текущего пользователя.
Зачем: Эта команда проверяет, есть ли у вас права sudo. Без них вы не сможете устанавливать пакеты через APT.
✅ Если выводит root — всё в порядке, можете продолжать.
❌ Если выводит is not in the sudoers file — сначала пройдите наше руководство по настройке sudo.
1.1 Обновление системы
Перед установкой всегда обновляйте список пакетов:
sudo apt update && sudo apt upgrade -y
Что делает:
sudo— права суперпользователяapt update— обновляет список доступных пакетов из репозиториев&&— выполняет следующую команду только если предыдущая успешнаapt upgrade -y— обновляет все установленные пакеты до последних версий
Зачем: Это стандартная практика безопасности перед установкой нового ПО.
1.2 Установка вспомогательных утилит (для tarball и source-сборки)
Для скачивания, проверки и распаковки tarball, а также для сборки из исходников понадобятся дополнительные инструменты.
sudo apt install ca-certificates curl tar git gcc jq -y
Что делает:
ca-certificates curl— для безопасного скачивания файлов по HTTPStar— для распаковки архивовgit— для клонирования репозитория Go (нужен для source-сборки)gcc— компилятор C, необходим для сборки Go из исходников и для работы некоторых Go-пакетов с cgojq— для парсинга JSON отgo.dev(надёжнее, чемsed)
Зачем: Без этих пакетов установка из tarball или исходников будет невозможна или небезопасна (без jq и проверки SHA256).
2. 📊 Сравнение способов установки Go
В Debian есть три основных способа установки Go. Вот их сравнение:
| Метод | Откуда | Пример версии (Debian 12) | Обновления | Плюсы | Минусы |
|---|---|---|---|---|---|
| APT | Репозитории Debian | 1.19.x | Через apt upgrade | Простота, безопасность, минимум усилий | Очень старые версии на Debian 11 и 12 |
| Официальный tarball | go.dev | Последняя стабильная (1.24.x) | Вручную (скрипт с проверкой версии) | Свежая версия, не требует компиляции, проверка SHA256 | Нужно вручную обновлять и настраивать PATH |
| Сборка из исходников | Исходный код Go | Последняя стабильная | Вручную (пересборка) | Максимальный контроль, можно патчить | Долго, сложно, требует много места |
💡 Рекомендация: Для большинства разработчиков лучший выбор — официальный tarball. Вы получаете самую свежую версию Go без необходимости компилировать, с проверкой контрольной суммы, а настройка PATH делается один раз. APT используйте только если версия Go в вашем Debian устраивает. Сборку из исходников оставьте для энтузиастов, которым нужно патчить сам компилятор.
3. 📦 Способ 1: Установка Go через APT (проще всего, но версия старше)
Этот способ подходит, если версия Go в вашем Debian устраивает. Вот какие версии вы получите:
| Версия Debian | Версия Go в репозитории |
|---|---|
| Debian 13 (Trixie) | 1.24.x |
| Debian 12 (Bookworm) | 1.19.x |
| Debian 11 (Bullseye) | 1.15.x |
⚠️ Важно: Go 1.15 (Debian 11) вышел в августе 2020 года. Многие современные проекты требуют версию не ниже 1.19 или 1.21. Если вам нужна актуальная версия — используйте tarball.
3.1 Установка пакета
sudo apt install golang-go -y
Что делает: Устанавливает Go из официальных репозиториев Debian. Пакет называется golang-go, но команда будет просто go.
Проверка установки:
go version
✅ Ожидаемый вывод в терминале (Debian 12):
go version go1.19.8 linux/amd64
3.2 Особенности APT-установки
- Не нужно настраивать PATH — Go уже в системе (
/usr/bin/go). - Обновления приходят вместе с системными обновлениями (
sudo apt upgrade). - Версия останется той, что в Debian, до следующего релиза дистрибутива.
4. 📦 Способ 2: Установка Go из официального tarball (рекомендованный)
Этот способ подходит для разработчиков, которым нужна актуальная версия Go. Вы скачаете готовый бинарный архив с go.dev, проверите его контрольную сумму и установите в /usr/local/go.
4.1 Определение архитектуры системы
dpkg --print-architecture
Что делает: Показывает архитектуру вашего процессора.
Что ищем:
amd64— 64-битные Intel/AMD (самый распространённый вариант)arm64— для Raspberry Pi 4/5 и подобныхi386— для старых 32-битных систем
4.2 Автоматическое скачивание, проверка и установка последней версии
Этот скрипт использует официальный JSON API Go, парсит его через jq, скачивает tarball для вашей архитектуры, проверяет SHA256 и устанавливает.
# Определяем архитектуру
case "$(dpkg --print-architecture)" in
amd64) GO_ARCH=amd64 ;;
arm64) GO_ARCH=arm64 ;;
i386) GO_ARCH=386 ;;
*) echo "Архитектура не поддерживается автоматически. Скачайте tarball вручную с https://go.dev/dl/" && exit 1 ;;
esac
# Получаем метаданные о последней версии
GO_METADATA=$(curl -fsSL 'https://go.dev/dl/?mode=json')
# Извлекаем версию, имя файла и SHA256 через jq
LATEST_VERSION=$(echo "$GO_METADATA" | jq -r '.[0].version')
GO_TARBALL=$(echo "$GO_METADATA" | jq -r --arg GOOS linux --arg GOARCH "$GO_ARCH" '.[0].files[] | select(.os == $GOOS and .arch == $GOARCH and .kind == "archive") | .filename')
GO_SHA256=$(echo "$GO_METADATA" | jq -r --arg GOOS linux --arg GOARCH "$GO_ARCH" '.[0].files[] | select(.os == $GOOS and .arch == $GOARCH and .kind == "archive") | .sha256')
if [ -z "$LATEST_VERSION" ] || [ "$LATEST_VERSION" = null ] || [ -z "$GO_TARBALL" ] || [ "$GO_TARBALL" = null ] || [ -z "$GO_SHA256" ] || [ "$GO_SHA256" = null ]; then
echo "Ошибка: не удалось получить информацию о последней версии Go для архитектуры $GO_ARCH."
echo "Скачайте tarball вручную с https://go.dev/dl/"
exit 1
fi
echo "Найдена версия: $LATEST_VERSION"
echo "Файл: $GO_TARBALL"
# Скачиваем tarball
echo "Скачиваю ${GO_TARBALL}..."
curl -fL --progress-bar -o "/tmp/${GO_TARBALL}" "https://go.dev/dl/${GO_TARBALL}"
# Проверяем SHA256 (важно для безопасности!)
echo "Проверяю контрольную сумму SHA256..."
printf '%s %s\n' "$GO_SHA256" "/tmp/${GO_TARBALL}" | sha256sum -c -
# Удаляем старую установку (если есть)
sudo rm -rf /usr/local/go
# Распаковываем в /usr/local
sudo tar -C /usr/local -xzf "/tmp/${GO_TARBALL}"
# Удаляем скачанный архив
rm -f "/tmp/${GO_TARBALL}"
echo "Go ${LATEST_VERSION} установлен в /usr/local/go"
Что делает по шагам:
- Определяет архитектуру процессора
- Запрашивает последнюю версию Go через официальный JSON API
- Парсит JSON с помощью
jq(надёжно, не сломается при изменении формата) - Скачивает нужный tarball во временную директорию
- Проверяет SHA256 — если контрольная сумма не совпадает, установка прервётся
- Удаляет старую установку (если она была)
- Распаковывает новый tarball в
/usr/local/go - Удаляет скачанный архив
Проверка установки (прямой путь, без PATH):
/usr/local/go/bin/go version
✅ Ожидаемый вывод в терминале:
go version go1.24.4 linux/amd64
4.3 Настройка PATH (обязательно!)
Чтобы команда go работала из любого места, нужно добавить /usr/local/go/bin в переменную PATH.
Добавление PATH в ~/.profile (рекомендовано):
grep -q '/usr/local/go/bin' ~/.profile || echo 'export PATH=$PATH:/usr/local/go/bin:$HOME/go/bin' >> ~/.profile
source ~/.profile
Что делает:
grep -qпроверяет, есть ли уже такая строка в~/.profileecho ... >>добавляет строку в конец файла, если её там нетsource ~/.profileприменяет изменения в текущем терминале
Проверка, что Go теперь в PATH:
command -v go
✅ Ожидаемый вывод: /usr/local/go/bin/go
Проверка версии:
go version
4.4 Скрипт для обновления tarball-версии
Чтобы обновлять Go одной командой, создадим скрипт, который проверяет версию, скачивает и устанавливает новую только при необходимости.
Создание скрипта:
cat > ~/update-go-tarball.sh << 'EOF'
#!/usr/bin/env bash
set -euo pipefail
INSTALL_ROOT="/usr/local/go"
if [ "$(id -u)" -eq 0 ]; then
echo "Запускайте скрипт от обычного пользователя, не от root."
exit 1
fi
for cmd in curl jq sha256sum sudo tar; do
if ! command -v "$cmd" >/dev/null 2>&1; then
echo "Ошибка: $cmd не установлен."
exit 1
fi
done
if [ ! -x "$INSTALL_ROOT/bin/go" ]; then
echo "Ошибка: Go не найден в $INSTALL_ROOT. Сначала установите Go из tarball."
exit 1
fi
case "$(dpkg --print-architecture)" in
amd64) GO_ARCH=amd64 ;;
arm64) GO_ARCH=arm64 ;;
i386) GO_ARCH=386 ;;
*) echo "Архитектура не поддерживается автоматически."; exit 1 ;;
esac
GO_METADATA=$(curl -fsSL 'https://go.dev/dl/?mode=json')
LATEST_VERSION=$(echo "$GO_METADATA" | jq -r '.[0].version')
GO_TARBALL=$(echo "$GO_METADATA" | jq -r --arg GOOS linux --arg GOARCH "$GO_ARCH" '.[0].files[] | select(.os == $GOOS and .arch == $GOARCH and .kind == "archive") | .filename')
GO_SHA256=$(echo "$GO_METADATA" | jq -r --arg GOOS linux --arg GOARCH "$GO_ARCH" '.[0].files[] | select(.os == $GOOS and .arch == $GOARCH and .kind == "archive") | .sha256')
CURRENT_VERSION=$("$INSTALL_ROOT/bin/go" version | awk '{print $3}')
echo "Текущая версия: $CURRENT_VERSION"
echo "Последняя версия: $LATEST_VERSION"
if [ "$CURRENT_VERSION" = "$LATEST_VERSION" ]; then
echo "Go уже последней версии."
exit 0
fi
TMP_DIR=$(mktemp -d)
trap 'rm -rf "$TMP_DIR"' EXIT
ARCHIVE_PATH="$TMP_DIR/$GO_TARBALL"
curl -fL --progress-bar -o "$ARCHIVE_PATH" "https://go.dev/dl/${GO_TARBALL}"
printf '%s %s\n' "$GO_SHA256" "$ARCHIVE_PATH" | sha256sum -c -
sudo rm -rf "$INSTALL_ROOT"
sudo tar -C /usr/local -xzf "$ARCHIVE_PATH"
"$INSTALL_ROOT/bin/go" version
echo "Go обновлён до $LATEST_VERSION."
EOF
chmod +x ~/update-go-tarball.sh
Запуск обновления:
~/update-go-tarball.sh
Что делает скрипт:
- Проверяет, что установлен
jq,curl,sha256sum - Определяет текущую версию Go
- Сравнивает с последней версией на go.dev
- Если версии разные — скачивает, проверяет SHA256 и устанавливает
⚠️ Важно: Запускайте скрипт вручную, не автоматизируйте через cron.
5. 🔧 Способ 3: Сборка Go из исходников (для энтузиастов)
Этот способ подходит только если вы планируете патчить сам компилятор Go или тестировать невыпущенные версии. Для обычной разработки используйте tarball.
⚠️ Важно: Сборка из исходников требует:
- Установленного Go (для загрузки!) — используется как bootstrap
- Около 10-15 минут времени
- Около 2-3 ГБ свободного места
5.1 Установка инструментов (ещё раз проверим)
sudo apt install git gcc jq -y
5.2 Установка bootstrap Go (если ещё не установлен)
Для сборки Go из исходников нужен уже установленный Go. Самый простой способ — установить официальный tarball по инструкции из раздела 4.
5.3 Клонирование репозитория и сборка
# Определяем последнюю версию через jq
LATEST_VERSION=$(curl -fsSL https://go.dev/dl/?mode=json | jq -r '.[0].version')
# Удаляем старый исходник (если есть)
rm -rf "$HOME/goroot-src"
# Клонируем репозиторий
git clone --depth 1 --branch "$LATEST_VERSION" https://go.googlesource.com/go "$HOME/goroot-src"
# Переходим в директорию с исходниками и собираем
cd "$HOME/goroot-src/src"
export GOROOT_BOOTSTRAP=/usr/local/go
./make.bash
Что делает:
git clone --depth 1— клонирует только последний коммит (экономит время и место)export GOROOT_BOOTSTRAP— указывает, где взять Go для сборки./make.bash— запускает скрипт сборки
✅ Ожидаемый вывод в конце сборки:
Installed Go for linux/amd64 in /home/username/goroot-src
Installed commands in /home/username/goroot-src/bin
*** You need to add /home/username/goroot-src/bin to your PATH. ***
5.4 Настройка PATH для source-сборки
grep -q '/goroot-src/bin' ~/.profile || echo 'export PATH=$PATH:$HOME/goroot-src/bin:$HOME/go/bin' >> ~/.profile
source ~/.profile
5.5 Проверка
go version
5.6 Скрипт для обновления source-сборки
cat > ~/update-go-source.sh << 'EOF'
#!/usr/bin/env bash
set -euo pipefail
SOURCE_DIR="$HOME/goroot-src"
BOOTSTRAP_ROOT="/usr/local/go"
if [ ! -d "$SOURCE_DIR/.git" ]; then
echo "Ошибка: исходники не найдены. Сначала соберите Go из исходников."
exit 1
fi
if [ ! -x "$BOOTSTRAP_ROOT/bin/go" ]; then
echo "Ошибка: bootstrap Go не найден в $BOOTSTRAP_ROOT"
exit 1
fi
LATEST_TAG=$(curl -fsSL https://go.dev/dl/?mode=json | jq -r '.[0].version')
CURRENT_TAG=$(git -C "$SOURCE_DIR" describe --tags --exact-match 2>/dev/null || echo "none")
echo "Текущая версия: $CURRENT_TAG"
echo "Последняя версия: $LATEST_TAG"
if [ "$CURRENT_TAG" = "$LATEST_TAG" ]; then
echo "Go уже последней версии."
exit 0
fi
git -C "$SOURCE_DIR" fetch --tags
git -C "$SOURCE_DIR" checkout "$LATEST_TAG"
cd "$SOURCE_DIR/src"
export GOROOT_BOOTSTRAP="$BOOTSTRAP_ROOT"
./make.bash
echo "Go обновлён до $LATEST_TAG"
EOF
chmod +x ~/update-go-source.sh
Запуск обновления:
~/update-go-source.sh
6. 🧪 Проверка установки: тестовая программа
После установки Go любым способом стоит убедиться, что он работает. Для этого мы создадим и запустим простую программу.
6.1 Создание тестового модуля
mkdir -p ~/go-hello && cd ~/go-hello
go mod init hello
Что делает: go mod init hello создаёт файл go.mod — модуль Go.
✅ Ожидаемый вывод:
go: creating new go.mod: module hello
6.2 Написание кода
cat <<'EOF' > hello.go
package main
import "fmt"
func main() {
fmt.Println("Hello, World from Go!")
}
EOF
6.3 Запуск
go run hello.go
✅ Ожидаемый вывод:
Hello, World from Go!
Если вы видите эту строку — Go установлен и работает корректно.
6.4 Очистка
cd ~ && rm -rf ~/go-hello
7. ⚠️ Решение типичных проблем
7.1 Ошибка: go: command not found
Симптом: После установки tarball или source-сборки команда go не найдена.
Причина: Директория с бинарным файлом Go не добавлена в PATH.
Пошаговое решение:
Шаг 1: Проверьте, существует ли бинарный файл:
ls /usr/local/go/bin/go
Если файл есть — проблема в PATH.
Шаг 2: Добавьте PATH временно:
export PATH=$PATH:/usr/local/go/bin
Шаг 3: Проверьте, что Go работает:
go version
Шаг 4: Сделайте изменение постоянным:
echo 'export PATH=$PATH:/usr/local/go/bin:$HOME/go/bin' >> ~/.profile
source ~/.profile
7.2 Конфликт версий: после установки tarball показывает старую версию
Симптом: Вы установили tarball, но go version всё ещё показывает старую версию (например, из APT).
Причина: В PATH первым находится /usr/bin/go (APT-версия).
Пошаговое решение:
Шаг 1: Посмотрите, какие Go установлены:
which -a go
✅ Пример вывода:
/usr/bin/go
/usr/local/go/bin/go
Шаг 2: Удалите APT-версию, если она не нужна:
sudo apt purge golang-go -y
sudo apt autoremove -y
Шаг 3: Или измените порядок PATH (но проще удалить APT-версию).
7.3 Ошибка: gcc: command not found при сборке Go-проекта
Симптом: При запуске go run или go build появляется ошибка:
# runtime/cgo
gcc: command not found
Причина: Отсутствует компилятор C (gcc), который нужен для работы cgo (часть Go для вызова C-кода).
Решение:
sudo apt install gcc -y
7.4 Ошибка: SHA256 mismatch при установке tarball
Симптом: При проверке SHA256 появляется ошибка:
sha256sum: /tmp/go1.24.4.linux-amd64.tar.gz: FAILED
Причина: Файл повреждён при скачивании (или подмена, но чаще просто обрыв связи).
Пошаговое решение:
Шаг 1: Удалите повреждённый файл:
rm -f /tmp/go*.tar.gz
Шаг 2: Повторите установку из раздела 4.2.
7.5 Ошибка: tar: Cannot open: No such file or directory
Симптом: При распаковке tarball появляется ошибка:
tar: Cannot open: No such file or directory
Причина: Файл не скачался (возможно, из-за проблем с сетью).
Пошаговое решение:
Шаг 1: Проверьте, существует ли файл:
ls -la /tmp/go*.tar.gz
Шаг 2: Если файла нет — повторите скачивание, предварительно проверив интернет-соединение.
8. ❌ Удаление Go
Удаление APT-версии
sudo apt purge golang-go golang-src -y
sudo apt autoremove -y
Удаление tarball-версии
sudo rm -rf /usr/local/go
Удаление PATH из ~/.profile:
sed -i '\|/usr/local/go/bin|d' ~/.profile
source ~/.profile
Удаление source-сборки
rm -rf "$HOME/goroot-src"
Удаление PATH из ~/.profile:
sed -i '\|/goroot-src/bin|d' ~/.profile
source ~/.profile
Удаление workspace (модули и скомпилированные бинарники)
⚠️ Осторожно: Удаляет все ваши Go-проекты и скачанные модули.
rm -rf "$HOME/go"
Проверка удаления
command -v go
✅ Ожидаемый вывод: Пустая строка (если Go больше не установлен).
9. 📝 Чек-лист: всё готово к работе
- [ ] Система обновлена (
sudo apt update && sudo apt upgrade -y) - [ ] Установлены вспомогательные пакеты (
curl,tar,git,gcc,jq) - [ ] Выбран и выполнен один из способов установки (APT / tarball / source)
- [ ]
go versionпоказывает ожидаемую версию - [ ] Для tarball и source: Go добавлен в PATH (
command -v goпоказывает правильный путь) - [ ] (Для tarball) Скрипт обновления создан и работает (
~/update-go-tarball.sh) - [ ] Тестовый модуль создаётся (
go mod init helloв пустой директории) - [ ] Тестовая программа запускается (
go run hello.goвыводитHello, World from Go!)
Заключение
Вы установили Go на Debian. Если вы выбрали APT — получили стабильную, но, скорее всего, старую версию. Если выбрали официальный tarball — получили самую свежую версию с проверкой SHA256, готовую для разработки, и скрипт для удобного обновления. Если собрали из исходников — получили максимальный контроль, но за это пришлось заплатить временем компиляции.
Теперь вы можете разрабатывать на Go, компилировать Go-проекты и использовать современные инструменты, написанные на этом языке.
Что дальше:
- Изучите официальную документацию Go, особенно раздел «How to Write Go Code»
- Настройте редактор (VS Code, GoLand, Vim) с поддержкой
gopls - Установите дополнительные инструменты:
go install golang.org/x/tools/gopls@latest - Изучите управление зависимостями через
go mod
Связанные статьи: