4.10.1 مقدمه #
YAML یک زبان فراهم کننده ساختار پذیر برای نمایش اطلاعات است که در قالب متن موجود میباشد. این زبان ابتدا برای نوشتن سندهای XML توسعه یافت که با پیشرفت کاربردهای آن به محل جایگزینی برای فرمتهای رایجی همچون JSON و اقلیتاً TOML تبدیل شده است.
این فرمت در صنعتهای مختلف مورد استفاده و ستوده شده است، مانند ذخیره سازی تنظیمات سیستمی، فایلهای کانفیگ مختلف، فایلهای داده و … . همچنین به خاطر قابل خواندن بودن برای انسان، استفاده از YAML در فایلهایی که باید توسط بشر خوانده شوند مانند فایلهای خودرو، پروژه و… صورت گرفته است.
یکی از نمونههای کاربردی YAML، استفاده از آن در فایلهای کانفیگ Docker است. در فایل docker-compose.yaml
، بخشهای مختلفی از یک سرویس در قالب Block mapping و با کلیدهای خاصی مانند version
، services
، ports
و غیره تعریف شده است. این فرمت به طور کل شرکتهای بزرگی مانند مایکروسافت، ایبیای و گوگل، در محصولات خود به صورت فایلهای YAML استفاده میکنند.
بنابراین، میتوان گفت YAML یک فرمت متنی ساده و پذیرفتنی است که در بسیاری از پروژههای نرمافزاری استفاده میشود، به خاطر پشتیبانی از انواع دادهها و ساختارهای مختلف، قابلیت خواندن و نوشتن آسان برای انسان و قابل استفاده در زبانهای مختلفی استفاده از YAML در صنایع مختلفی از جمله فناوریهای اطلاعات، اینترنت اشیا و… رایج است.
4.10.2 کار با marshal و unmarshal پکیج yaml #
پکیج YAML در زبان Go شامل توابع Marshal و Unmarshal برای تبدیل دادههای Go به فرمت YAML و بالعکس میشود. استفاده از این توابع بسیار ساده است و میتوان به سرعت با استفاده از ویژگیهای زبان Go به دادهها دسترسی پیدا کرد.
برای مثال، فرض کنید یک پرونده YAML با محتوای زیر داریم:
4.10.2.1 Marshal #
همچنین، میتوان از تابع Marshal برای تبدیل ساختار دادهای Go به فرمت YAML استفاده کرد. به عنوان مثال، برای تبدیل ساختار Person به فرمت YAML میتوان از کد زیر استفاده کرد:
1package main
2
3import (
4 "fmt"
5 "gopkg.in/yaml.v2"
6 "log"
7)
8
9func main() {
10 person := Person{
11 Name: "John",
12 Age: 25,
13 IsStudent: true,
14 }
15
16 yamlData, err := yaml.Marshal(&person)
17 if err != nil {
18 log.Fatalf("error: %v", err)
19 }
20
21 fmt.Printf("%s", string(yamlData))
22}
در این کد، یک شیء از ساختار Person را ایجاد می کنیم و سپس از تابع Marshal برای تبدیل آن به فرمت YAML استفاده می کنیم. سپس محتوای YAML را به کمک تابع Printf چاپ می کنیم.
به این ترتیب پکیج YAML از امکانات و قابلیت بالایی برای کد نویسی و کار با فرمت YAML در زبان Go برخوردار میباشد.
4.10.2.2 Unmarshal #
میتوانیم این پرونده را به کمک تابع Unmarshal به یک ساختار Go تبدیل کنیم. برای این کار، ابتدا نیاز است که یک ساختار دادهای برای ذخیره اطلاعات YAML تعریف کنیم. در این حالت، میتوانیم از ساختار زیر استفاده کنیم:
1type Person struct {
2 Name string `yaml:"name"`
3 Age int `yaml:"age"`
4 IsStudent bool `yaml:"isStudent"`
5}
حالا می توانیم از تابع Unmarshal برای تبدیل دادهی YAML به ساختار Go استفاده کنیم:
1package main
2
3import (
4 "fmt"
5 "gopkg.in/yaml.v2"
6 "log"
7)
8
9type Person struct {
10 Name string `yaml:"name"`
11 Age int `yaml:"age"`
12 IsStudent bool `yaml:"isStudent"`
13}
14
15func main() {
16 yamlData := `
17name: John
18age: 25
19isStudent: true
20`
21
22 var person Person
23
24 err := yaml.Unmarshal([]byte(yamlData), &person)
25 if err != nil {
26 log.Fatalf("error: %v", err)
27 }
28
29 fmt.Printf("Name: %s\nAge: %d\nIsStudent: %v", person.Name, person.Age, person.IsStudent)
30}
این کد پرونده YAML را به متغیر yamlData منتسب کرده، از تابع Unmarshal برای تجزیه و تحلیل دادههای YAML استفاده و ساختار Person را با مقادیر معادل پر کردهاست. سپس جزئیات این ساختار را چاپ میکنیم.