Установка 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 (актуальная версия)
  • Как собрать 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 -y

Что делает:

  • ca-certificates curl — для безопасного скачивания файлов по HTTPS
  • tar — для распаковки архивов
  • git — для клонирования репозитория Go (нужен для source-сборки)
  • gcc — компилятор C, необходим для сборки Go из исходников и для работы некоторых Go-пакетов с cgo

Зачем: Без этих пакетов установка из tarball или исходников будет невозможна.

2. 📊 Сравнение способов установки Go

В Debian есть три основных способа установки Go. Вот их сравнение:

МетодОткудаПример версии (Debian 12)ОбновленияПлюсыМинусы
APTРепозитории
Debian
1.19.xЧерез
apt upgrade
Простота,
безопасность,
минимум
усилий
Очень старые
версии на
Debian 11 и 12
Официальный
tarball
go.devПоследняя
стабильная
(1.24.x)
Вручную
(переустановка)
Свежая
версия, не
требует
компиляции
Нужно
вручную
обновлять и
настраивать
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 Автоматическое скачивание и установка последней версии

Этот скрипт сам определяет последнюю версию Go, скачивает нужный tarball для вашей архитектуры и устанавливает его.

# Определяем последнюю версию Go
GO_VERSION=$(curl -fsSL https://go.dev/dl/?mode=json 2>/dev/null | sed -n '/"version"/{s/.*"version": "\(go[0-9.]*\)".*/\1/p;q;}')

# Определяем архитектуру и формируем имя файла
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_TARBALL="${GO_VERSION}.linux-${GO_ARCH}.tar.gz"

# Скачиваем tarball
echo "Скачиваю ${GO_TARBALL}..."
curl -fL --progress-bar -o "/tmp/${GO_TARBALL}" "https://go.dev/dl/${GO_TARBALL}"

# Удаляем старую установку (если есть)
sudo rm -rf /usr/local/go

# Распаковываем в /usr/local
sudo tar -C /usr/local -xzf "/tmp/${GO_TARBALL}"

# Удаляем скачанный архив
rm -f "/tmp/${GO_TARBALL}"

echo "Go ${GO_VERSION} установлен в /usr/local/go"

Что делает по шагам:

  1. Запрашивает последнюю версию Go через официальный API
  2. Определяет архитектуру процессора
  3. Скачивает нужный tarball во временную директорию
  4. Удаляет старую установку (если она была)
  5. Распаковывает новый tarball в /usr/local/go
  6. Удаляет скачанный архив

Проверка установки (прямой путь, без 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

5. 🔧 Способ 3: Сборка Go из исходников (для энтузиастов)

Этот способ подходит только если вы планируете патчить сам компилятор Go или тестировать невыпущенные версии. Для обычной разработки используйте tarball.

⚠️ Важно: Сборка из исходников требует:

  • Установленного Go (для загрузки!) — используется как bootstrap
  • Около 10-15 минут времени
  • Около 2-3 ГБ свободного места

5.1 Установка инструментов (ещё раз проверим)

sudo apt install git gcc -y

5.2 Установка bootstrap Go (если ещё не установлен)

Для сборки Go из исходников нужен уже установленный Go (странно, но факт). Самый простой способ — установить официальный tarball по инструкции из раздела 4.

# Устанавливаем tarball (если ещё не сделали)
# См. раздел 4.2

5.3 Клонирование репозитория и сборка

# Определяем последнюю версию
GO_VERSION=$(curl -fsSL https://go.dev/dl/?mode=json 2>/dev/null | sed -n '/"version"/{s/.*"version": "\(go[0-9.]*\)".*/\1/p;q;}')

# Удаляем старый исходник (если есть)
rm -rf "$HOME/goroot-src"

# Клонируем репозиторий
git clone --depth 1 --branch "$GO_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

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. 🔄 Обновление Go

Для APT-версии

sudo apt update
sudo apt install --only-upgrade golang-go -y

Для tarball-версии

Просто повторите шаги из раздела 4.2. Скрипт сам скачает и установит последнюю версию, заменив старую.

Для 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

# Проверяем, есть ли bootstrap
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 2>/dev/null | sed -n '/"version"/{s/.*"version": "\(go[0-9.]*\)".*/\1/p;q;}')
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

8. ⚠️ Решение типичных проблем

8.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

8.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-версию).

8.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

8.4 Ошибка: 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: Если файла нет — повторите скачивание вручную:

curl -L -o /tmp/go.tar.gz https://go.dev/dl/go1.24.4.linux-amd64.tar.gz

(Замените версию и архитектуру на нужные.)

Шаг 3: Повторите распаковку.

9. ❌ Удаление 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 больше не установлен).

10. 📝 Чек-лист: всё готово к работе

  • [ ] Система обновлена (sudo apt update && sudo apt upgrade -y)
  • [ ] Выбран и выполнен один из способов установки (APT / tarball / source)
  • [ ] go version показывает ожидаемую версию
  • [ ] Для tarball и source: Go добавлен в PATH (command -v go показывает правильный путь)
  • [ ] Тестовый модуль создаётся (go mod init hello в пустой директории)
  • [ ] Тестовая программа запускается (go run hello.go выводит Hello, World from Go!)

Заключение

Вы установили Go на Debian. Если вы выбрали APT — получили стабильную, но, скорее всего, старую версию. Если выбрали официальный tarball — получили самую свежую версию, готовую для разработки. Если собрали из исходников — получили максимальный контроль, но за это пришлось заплатить временем компиляции.

Теперь вы можете разрабатывать на Go, компилировать Go-проекты и использовать современные инструменты, написанные на этом языке.

Что дальше:

  • Изучите официальную документацию Go, особенно раздел «How to Write Go Code»
  • Настройте редактор (VS Code, GoLand, Vim) с поддержкой gopls
  • Установите дополнительные инструменты: go install golang.org/x/tools/gopls@latest
  • Изучите управление зависимостями через go mod
  • Если вы работаете с Go-проектами, установите git (sudo apt install git -y)