Введение в Go: с чего начать в 2025 году: на практике
Go (или Golang) — это компилируемый, статически типизированный язык программирования, разработанный в Google. В 2025 году он прочно занимает нишу высокопроизводительных микросервисов, облачных приложений и DevOps-инструментов. Если вы хотите начать изучать Go с практической точки зрения, это руководство проведет вас от установки до написания первой осмысленной программы.
Почему Go? Он сочетает простоту Python с производительностью C. Go идеален для создания надежных серверных приложений, сетевых утилит и параллельных вычислений благодаря встроенной поддержке горутин (goroutines). В этой статье мы разберем ключевые концепции на примерах кода, которые вы сможете сразу запустить.
1. Установка и настройка окружения
Первым шагом является установка компилятора Go. В 2025 году актуальной стабильной версией является Go 1.22 или 1.23. Установка проста:
- Windows: Скачайте MSI-установщик с официального сайта и запустите его.
- macOS: Используйте Homebrew:
brew install go. - Linux: Скачайте архив
.tar.gzи распакуйте его в/usr/localили используйте менеджер пакетов (например,sudo apt install golang-go).
После установки проверьте версию в терминале:
go version
Вы должны увидеть что-то вроде go version go1.22.0 linux/amd64. Теперь создайте рабочее пространство (workspace). В Go принято хранить все проекты в одной папке. Создайте папку go-projects и внутри нее папку для первого проекта:
mkdir -p ~/go-projects/hello
cd ~/go-projects/hello
Инициализируйте модуль — это основная единица управления зависимостями:
go mod init hello
Эта команда создаст файл go.mod, который будет отслеживать зависимости вашего проекта.
2. Синтаксис: переменные, типы и управляющие конструкции
Go имеет строгую, но лаконичную систему типов. Давайте создадим файл main.go и напишем базовый пример:
package main
import "fmt"
func main() {
// Объявление переменных
var name string = "Go"
var version int = 2025
isFast := true // короткое объявление (тип выводится автоматически)
fmt.Println("Привет,", name)
fmt.Println("Версия:", version)
fmt.Println("Go быстрый?", isFast)
// Условный оператор
if version > 2024 {
fmt.Println("Это актуальная версия!")
}
// Цикл for (единственный цикл в Go)
for i := 0; i < 3; i++ {
fmt.Printf("Итерация %d\n", i)
}
}
Ключевые моменты:
package main— указывает, что это исполняемая программа.import "fmt"— импорт пакета для форматированного ввода/вывода.varи:=— два способа объявления переменных.:=используется только внутри функций.- Типы:
string,int,bool,float64и другие.
Запустите программу командой go run main.go. Вы должны увидеть вывод в консоли.
3. Функции и структуры: основа модульности
Функции в Go объявляются с помощью ключевого слова func. Они могут возвращать несколько значений — это одна из ключевых фич языка. Структуры (struct) — это аналоги классов в ООП, но без наследования.
package main
import "fmt"
// Структура для представления пользователя
type User struct {
Name string
Age int
}
// Функция, возвращающая несколько значений
func createUser(name string, age int) (User, error) {
if age < 0 {
return User{}, fmt.Errorf("возраст не может быть отрицательным")
}
return User{Name: name, Age: age}, nil
}
// Метод для структуры User
func (u User) greet() string {
return fmt.Sprintf("Привет, меня зовут %s и мне %d лет", u.Name, u.Age)
}
func main() {
user, err := createUser("Алексей", 30)
if err != nil {
fmt.Println("Ошибка:", err)
return
}
fmt.Println(user.greet())
// Анонимная функция
double := func(x int) int {
return x * 2
}
fmt.Println("Удвоенное значение:", double(5))
}
Важные концепции:
- Множественный возврат:
(User, error)— стандартный паттерн обработки ошибок в Go. Если ошибки нет, возвращаетсяnil. - Методы: Функция с ресивером
(u User)— это метод, который может быть вызван на экземпляре структуры. - Ошибки: Встроенный интерфейс
errorиспользуется повсеместно. Не игнорируйте ошибки!
4. Первый практический проект: HTTP-сервер
Go славится своей стандартной библиотекой. Напишем простой веб-сервер, который принимает GET-запросы и возвращает JSON. Это основа для любого микросервиса.
package main
import (
"encoding/json"
"fmt"
"log"
"net/http"
)
// Структура ответа
type Response struct {
Message string `json:"message"`
Year int `json:"year"`
}
// Обработчик запросов
func helloHandler(w http.ResponseWriter, r *http.Request) {
// Устанавливаем заголовок Content-Type
w.Header().Set("Content-Type", "application/json")
resp := Response{
Message: "Добро пожаловать в Go!",
Year: 2025,
}
// Кодируем структуру в JSON и отправляем
err := json.NewEncoder(w).Encode(resp)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
}
}
func main() {
// Регистрируем обработчик для пути "/"