Home » Установка Go на Ubuntu 24
Установка Go на Ubuntu 24

Установка 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-сообщество очень дружелюбное, а документация — одна из лучших в индустрии.

Полезные ссылки для дальнейшего изучения:


В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.

Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.

Leave a reply

Your email address will not be published. Required fields are marked