العمل مع YAML في Go (Golang): مكتبات go-yaml و yaml.v3

مدرب بايثون أونلاين للمبتدئين

تعلم 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: 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

توصيات