- Home »

Установка Go на Ubuntu 24
Установка Go на Ubuntu 24 — это та тема, которая может показаться банальной, но на самом деле имеет множество подводных камней. Особенно если вы настраиваете продакшен-сервер или планируете деплоить Go-приложения. В этой статье разберём не только стандартные способы установки, но и покажем, как правильно настроить окружение для разработки, какие есть альтернативы и как избежать типичных ошибок. Поговорим о том, как Go интегрируется с современными инструментами автоматизации и что нового появилось в последних версиях.
Как работает установка Go в Ubuntu 24
Go (или Golang) — это компилируемый язык программирования, который не требует виртуальной машины для выполнения. Это означает, что после установки компилятора вы получаете готовый к работе инструмент для создания бинарных файлов. В Ubuntu 24 есть несколько способов установки:
- Через apt — простой, но не всегда актуальный способ
- Загрузка с официального сайта — наиболее надёжный метод
- Через snap — изолированная установка
- Через gvm — менеджер версий Go
Каждый метод имеет свои плюсы и минусы, которые мы рассмотрим детально.
Способ 1: Установка через apt (быстро, но не всегда свежо)
Самый простой способ — использовать системный пакетный менеджер:
sudo apt update
sudo apt install golang-go
# Проверяем версию
go version
Проблема этого метода в том, что репозитории Ubuntu часто содержат устаревшие версии Go. На момент написания статьи в Ubuntu 24 доступна версия 1.22, в то время как актуальная может быть 1.23 или новее.
Способ 2: Установка с официального сайта (рекомендуется)
Этот метод гарантирует получение самой свежей версии:
# Скачиваем последнюю версию (замените версию на актуальную)
wget https://golang.org/dl/go1.23.0.linux-amd64.tar.gz
# Удаляем старую версию, если есть
sudo rm -rf /usr/local/go
# Распаковываем в /usr/local
sudo tar -C /usr/local -xzf go1.23.0.linux-amd64.tar.gz
# Добавляем в PATH
echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc
source ~/.bashrc
# Проверяем установку
go version
Интересный факт: Go команда Google изначально разрабатывала для внутренних нужд, чтобы справиться с большими кодовыми базами. Отсюда и фокус на скорость компиляции и простоту развёртывания.
Способ 3: Установка через snap
Snap-пакеты обеспечивают изоляцию и автоматические обновления:
sudo snap install go --classic
# Проверяем версию
go version
Флаг --classic
необходим, так как Go требует доступа к файловой системе без ограничений.
Способ 4: Использование gvm (Go Version Manager)
Для разработчиков, работающих с несколькими версиями Go, gvm — идеальное решение:
# Устанавливаем gvm
bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)
# Перезагружаем shell
source ~/.gvm/scripts/gvm
# Устанавливаем Go 1.4 (нужна для компиляции новых версий)
gvm install go1.4 -B
gvm use go1.4 --default
# Устанавливаем последнюю версию
gvm install go1.23.0
gvm use go1.23.0 --default
# Проверяем
go version
Настройка окружения для разработки
После установки Go важно правильно настроить рабочее окружение:
# Создаём рабочую директорию
mkdir -p ~/go/{bin,src,pkg}
# Настраиваем GOPATH и GOROOT
echo 'export GOROOT=/usr/local/go' >> ~/.bashrc
echo 'export GOPATH=$HOME/go' >> ~/.bashrc
echo 'export PATH=$PATH:$GOROOT/bin:$GOPATH/bin' >> ~/.bashrc
# Применяем изменения
source ~/.bashrc
# Проверяем окружение
go env
Начиная с Go 1.11, появилась поддержка модулей, которая делает GOPATH менее критичным, но знать об этом всё равно полезно.
Сравнение методов установки
Метод | Актуальность версии | Простота установки | Управление версиями | Изоляция |
---|---|---|---|---|
apt | Низкая | Очень высокая | Нет | Нет |
Официальный сайт | Высокая | Средняя | Ручное | Нет |
Snap | Высокая | Высокая | Автоматическое | Да |
gvm | Высокая | Средняя | Отличное | Частичная |
Тестирование установки
Создадим простое приложение для проверки:
# Создаём проект
mkdir ~/hello-go
cd ~/hello-go
# Инициализируем модуль
go mod init hello-go
# Создаём main.go
cat > main.go << 'EOF'
package main
import (
"fmt"
"net/http"
)
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, Go on Ubuntu 24!")
})
fmt.Println("Server starting on :8080...")
http.ListenAndServe(":8080", nil)
}
EOF
# Компилируем и запускаем
go run main.go
Теперь откройте браузер и перейдите на http://localhost:8080
— должно отобразиться приветствие.
Интеграция с системными сервисами
Для продакшен-серверов важно уметь создавать systemd-сервисы:
# Компилируем приложение
go build -o hello-server main.go
# Создаём systemd unit файл
sudo tee /etc/systemd/system/hello-go.service << 'EOF'
[Unit]
Description=Hello Go Server
After=network.target
[Service]
Type=simple
User=www-data
WorkingDirectory=/opt/hello-go
ExecStart=/opt/hello-go/hello-server
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
# Копируем файлы
sudo mkdir -p /opt/hello-go
sudo cp hello-server /opt/hello-go/
sudo chown -R www-data:www-data /opt/hello-go
# Запускаем сервис
sudo systemctl daemon-reload
sudo systemctl enable hello-go
sudo systemctl start hello-go
# Проверяем статус
sudo systemctl status hello-go
Продвинутые возможности и автоматизация
Go отлично подходит для создания инструментов автоматизации. Вот несколько примеров:
- Создание CLI-утилит — библиотека cobra делает это тривиальным
- Веб-сервисы — встроенный HTTP-сервер очень производительный
- Системные утилиты — отличная работа с файловой системой
- Контейнеризация — статические бинарники идеально подходят для Docker
Пример создания простой CLI-утилиты:
# Создаём новый проект
mkdir ~/system-monitor
cd ~/system-monitor
go mod init system-monitor
# Устанавливаем зависимости
go get github.com/spf13/cobra
go get github.com/shirou/gopsutil/v3/cpu
go get github.com/shirou/gopsutil/v3/mem
# Создаём main.go с мониторингом системы
cat > main.go << 'EOF'
package main
import (
"fmt"
"github.com/shirou/gopsutil/v3/cpu"
"github.com/shirou/gopsutil/v3/mem"
"github.com/spf13/cobra"
"time"
)
func main() {
var rootCmd = &cobra.Command{
Use: "sysmon",
Short: "System monitor tool",
Run: func(cmd *cobra.Command, args []string) {
// CPU информация
cpuPercent, _ := cpu.Percent(time.Second, false)
// Память
memInfo, _ := mem.VirtualMemory()
fmt.Printf("CPU Usage: %.2f%%\n", cpuPercent[0])
fmt.Printf("Memory Usage: %.2f%%\n", memInfo.UsedPercent)
fmt.Printf("Memory Total: %d MB\n", memInfo.Total/1024/1024)
fmt.Printf("Memory Available: %d MB\n", memInfo.Available/1024/1024)
},
}
rootCmd.Execute()
}
EOF
# Компилируем и тестируем
go build -o sysmon main.go
./sysmon
Возможные проблемы и их решение
Проблема 1: Ошибка "go: command not found" после установки
Решение: Проверьте PATH и перезапустите терминал
echo $PATH | grep go
source ~/.bashrc
Проблема 2: Конфликты версий при использовании нескольких методов установки
Решение: Используйте which go
для определения активной версии и удалите ненужные
which go
# Если нужно удалить snap версию
sudo snap remove go
# Если нужно удалить apt версию
sudo apt remove golang-go
Проблема 3: Медленная компиляция больших проектов
Решение: Используйте кэширование модулей и параллельную компиляцию
# Очистка кэша модулей
go clean -modcache
# Компиляция с указанием количества процессов
GOMAXPROCS=4 go build
Альтернативные решения
Хотя Go — отличный выбор для многих задач, стоит знать об альтернативах:
- Rust — если нужна максимальная производительность и безопасность памяти
- Node.js — для быстрой разработки веб-приложений
- Python — для скриптов и прототипирования
- C/C++ — для системного программирования
Go занимает золотую середину между простотой Python и производительностью C++.
Статистика и факты
По данным Stack Overflow Developer Survey 2024:
- Go занимает 8-е место среди самых популярных языков программирования
- Средняя зарплата Go-разработчиков выше средней по отрасли
- Go показывает один из самых высоких рейтингов удовлетворённости разработчиков
- Время компиляции Go-проектов в среднем в 10 раз быстрее аналогичных проектов на C++
Крупные компании, использующие Go: Google, Uber, Dropbox, Docker, Kubernetes, Terraform.
Настройка для работы с Docker
Go-приложения отлично подходят для контейнеризации благодаря статической компиляции:
# Создаём Dockerfile
cat > Dockerfile << 'EOF'
# Многоэтапная сборка
FROM golang:1.23-alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -o main .
# Финальный образ
FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=builder /app/main .
EXPOSE 8080
CMD ["./main"]
EOF
# Собираем образ
docker build -t hello-go .
# Запускаем контейнер
docker run -p 8080:8080 hello-go
Автоматизация развёртывания
Для автоматизации развёртывания на VPS или выделенном сервере можно использовать простой скрипт:
#!/bin/bash
# deploy.sh
set -e
APP_NAME="hello-go"
DEPLOY_PATH="/opt/$APP_NAME"
SERVICE_NAME="$APP_NAME.service"
echo "Building application..."
go build -o $APP_NAME main.go
echo "Stopping service..."
sudo systemctl stop $SERVICE_NAME || true
echo "Copying files..."
sudo mkdir -p $DEPLOY_PATH
sudo cp $APP_NAME $DEPLOY_PATH/
sudo chown -R www-data:www-data $DEPLOY_PATH
echo "Starting service..."
sudo systemctl start $SERVICE_NAME
sudo systemctl enable $SERVICE_NAME
echo "Checking status..."
sudo systemctl status $SERVICE_NAME
echo "Deployment completed!"
Мониторинг и логирование
Для продакшен-приложений важно настроить мониторинг:
package main
import (
"log"
"net/http"
"os"
"time"
)
func loggingMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
start := time.Now()
next.ServeHTTP(w, r)
log.Printf("%s %s %v", r.Method, r.URL.Path, time.Since(start))
})
}
func main() {
// Настраиваем логирование
logFile, err := os.OpenFile("/var/log/hello-go.log",
os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
if err == nil {
log.SetOutput(logFile)
defer logFile.Close()
}
mux := http.NewServeMux()
mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Hello, Go!"))
})
// Эндпоинт для мониторинга
mux.HandleFunc("/health", func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
w.Write([]byte("OK"))
})
handler := loggingMiddleware(mux)
log.Println("Server starting on :8080")
log.Fatal(http.ListenAndServe(":8080", handler))
}
Заключение и рекомендации
Go — это отличный выбор для системного программирования, создания веб-сервисов и CLI-утилит. Для Ubuntu 24 рекомендую следующий подход:
- Для разработки: Используйте gvm для управления версиями
- Для продакшена: Устанавливайте с официального сайта для стабильности
- Для экспериментов: Snap-версия подойдёт идеально
- Для CI/CD: Используйте Docker-образы с Go
Go предоставляет уникальную комбинацию простоты разработки и производительности. Язык постоянно развивается, получая новые возможности типа дженериков (с версии 1.18) и улучшенной работы с модулями. Если вы работаете с серверной инфраструктурой, Go станет отличным дополнением к вашему арсеналу.
Основные преимущества Go для серверной разработки:
- Быстрая компиляция и развёртывание
- Отличная работа с параллельными вычислениями
- Богатая стандартная библиотека
- Статическая типизация с выводом типов
- Встроенная поддержка HTTP/2 и WebSocket
- Кроссплатформенность
Начните с простых проектов и постепенно изучайте продвинутые возможности языка. Go-сообщество очень дружелюбное, а документация — одна из лучших в индустрии.
Полезные ссылки для дальнейшего изучения:
В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.
Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.