Установка Go (Golang) на Debian 13, 12, 11: подробное руководство

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 — для безопасного скачивания файлов по HTTPS
  • tar — для распаковки архивов
  • git — для клонирования репозитория Go (нужен для source-сборки)
  • gcc — компилятор C, необходим для сборки Go из исходников и для работы некоторых Go-пакетов с cgo
  • jq — для парсинга 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 проверяет, есть ли уже такая строка в ~/.profile
  • echo ... >> добавляет строку в конец файла, если её там нет
  • 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

Связанные статьи: