Работа с YAML в Go (Golang): библиотеки go-yaml и yaml.v3

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Работа с YAML в Go (Golang): Полное руководство

YAML (YAML Ain't Markup Language) — это человекочитаемый формат сериализации данных, широко используемый для конфигурационных файлов, описания инфраструктуры (например, Kubernetes, Docker Compose) и обмена данными. В экосистеме Go (Golang) работа с YAML реализована через мощные сторонние библиотеки, главным образом через go-yaml (известную как gopkg.in/yaml.v3). В этой статье мы подробно разберём, как парсить, создавать и обрабатывать YAML-документы в Go.

Почему YAML важен для Go-разработчика?

Go — язык для создания высокопроизводительных серверных приложений, DevOps-инструментов и микросервисов. YAML стал де-факто стандартом для:

  • Конфигураций приложений (например, config.yaml);
  • Манифестов Kubernetes (deployment.yaml);
  • CI/CD пайплайнов (GitLab CI, GitHub Actions);
  • Описания API и схем данных.

Без умения работать с YAML в Go невозможно представить современную разработку на этом языке.

Основные библиотеки для работы с YAML в Go

На сегодняшний день существует две основные версии библиотеки:

  • gopkg.in/yaml.v2 — старая стабильная версия, всё ещё популярна;
  • gopkg.in/yaml.v3 — актуальная версия с поддержкой тегов, каналов и улучшенной обработкой ошибок (рекомендуется для новых проектов).

Обе библиотеки предоставляют функции Marshal (структура → YAML) и Unmarshal (YAML → структура).

Установка библиотеки

Для начала работы добавьте пакет в проект:

go get gopkg.in/yaml.v3

Импортируйте его в коде:

import "gopkg.in/yaml.v3"

Пример 1: Парсинг YAML в структуру (Unmarshal)

Создадим конфигурационный файл config.yaml:

server:
  host: "localhost"
  port: 8080
database:
  driver: "postgres"
  dsn: "host=localhost user=app password=secret dbname=mydb"
logging:
  level: "info"
  file: "/var/log/app.log"

Теперь напишем Go-код для чтения этого файла:

package main

import (
    "fmt"
    "os"
    "gopkg.in/yaml.v3"
)

type Config struct {
    Server   ServerConfig   `yaml:"server"`
    Database DatabaseConfig `yaml:"database"`
    Logging  LoggingConfig  `yaml:"logging"`
}

type ServerConfig struct {
    Host string `yaml:"host"`
    Port int    `yaml:"port"`
}

type DatabaseConfig struct {
    Driver string `yaml:"driver"`
    DSN    string `yaml:"dsn"`
}

type LoggingConfig struct {
    Level string `yaml:"level"`
    File  string `yaml:"file"`
}

func main() {
    data, err := os.ReadFile("config.yaml")
    if err != nil {
        panic(err)
    }

    var cfg Config
    err = yaml.Unmarshal(data, &cfg)
    if err != nil {
        panic(err)
    }

    fmt.Printf("Server: %s:%d\n", cfg.Server.Host, cfg.Server.Port)
    fmt.Printf("Database driver: %s\n", cfg.Database.Driver)
    fmt.Printf("Log level: %s\n", cfg.Logging.Level)
}

Вывод:

Server: localhost:8080
Database driver: postgres
Log level: info

Пример 2: Сериализация структуры в YAML (Marshal)

Теперь создадим структуру и преобразуем её в YAML:

package main

import (
    "fmt"
    "gopkg.in/yaml.v3"
)

type AppConfig struct {
    Name    string   `yaml:"name"`
    Version string   `yaml:"version"`
    Debug   bool     `yaml:"debug"`
    Tags    []string `yaml:"tags"`
}

func main() {
    cfg := AppConfig{
        Name:    "MyApp",
        Version: "1.0.0",
        Debug:   false,
        Tags:    []string{"production", "stable"},
    }

    out, err := yaml.Marshal(&cfg)
    if err != nil {
        panic(err)
    }

    fmt.Println(string(out))
}

Результат:

name: MyApp
version: "1.0.0"
debug: false
tags:
    - production
    - stable

Пример 3: Работа с вложенными и сложными структурами

YAML поддерживает

Рекомендаций