العمل مع 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: 8080database: 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", cfg.Server.Host, cfg.Server.Port) fmt.Printf("Database driver: %s", cfg.Database.Driver) fmt.Printf("Log level: %s", cfg.Logging.Level)}المخرجات:
Server: localhost:8080Database driver: postgresLog 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.P