Работа с 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 поддерживает