با استفاده از YAML، می توانید برنامه های Go را بنویسید که با استفاده از فرمت داده با دیگران تعامل دارند. برای انسان قابل خواندن است، کار با آن بسیار آسان است.
YAML یک فرمت سریال سازی داده های قابل خواندن توسط انسان محبوب است. زبان داده برای فایل های پیکربندی، تبادل داده و ذخیره سازی داده های ساخت یافته مناسب است.
بسیاری از پروژه های مبتنی بر Go، از جمله Gqlgen و ابزارهای ساخت مانند Docker-compose، از فایل های YAML برای پیکربندی استفاده می کنند. به عنوان یک توسعه دهنده Go، می توانید از ابزارهایی مانند بسته yaml برای تجزیه و دستکاری داده های YAML استفاده کنید.
آشنایی با فایل YAML
فایلهای YAML (YAML Ain’t Markup Language) از جفتهای کلید-مقدار، فهرستها و ساختارهای تودرتو تشکیل شدهاند. نحو YAML طوری طراحی شده است که از نظر بصری جذاب باشد و به راحتی قابل خواندن باشد. این باعث میشود که با Kubernetes و سایر ابزارهای ارکستراسیون که از YAML استفاده میکنند، گزینه محبوبی برای فایلهای پیکربندی باشد.
برخلاف سایر فرمتهای داده مانند XML و JSON، YAML برای نشان دادن سلسله مراتب به تورفتگی متکی است.
در اینجا نحوه تعریف فیلدهای اساسی با YAML آمده است:
name: John Doe
age: 30
email: john.doe@example.com
دو نقطه کلید را از مقدار آن جدا می کند که می تواند هر نوع داده معتبر YAML شامل رشته ها، اعداد، بولی ها یا ساختارهای تودرتو باشد.
لیست ها به شما امکان می دهند مجموعه ای از مقادیر را نشان دهید. برای تعریف یک لیست در YAML، از یک خط فاصله قبل از هر مورد استفاده کنید:
fruits:
- apple
- banana
- orange
در اینجا میوه ها کلید هستند و خطوط خط فاصله فهرستی از میوه ها را مشخص می کند.
YAML همچنین از ساختارهای تودرتو پشتیبانی می کند و به شما امکان می دهد سلسله مراتب داده های پیچیده را نشان دهید:
person:
name: John Doe
age: 30
address:
street: 123 Main St
city: Anytown
country: USA
کلید شخص شامل مجموعه دیگری از جفت های کلید-مقدار است که یک ساختار تودرتو را تشکیل می دهد. کلید آدرس مجموعه ای از جفت های کلید-مقدار خاص خود را دارد.
کار با YAML در Go
Go عملکرد داخلی را برای فایلهای YAML ارائه نمیکند، اما بستههای شخص ثالثی وجود دارند که این کار را انجام میدهند.
بسته yaml یک بسته محبوب برای کار با فایل های YAML است. فراهم می کند:
- ویژگی های تجزیه و سریال سازی
- پشتیبانی از تگ های YAML
- انطباق جامع با مشخصات YAML.
- کنترل ریزدانه بر مارشال کردن و مارشال کردن.
- رسیدگی به خطا.
- سازگاری با چندین نسخه YAML.
ترمینال خود را باز کنید و این دستور را برای نصب بسته YAML برای پروژه خود اجرا کنید:
# install version 3 of the yaml package
go get gopkg.in/yaml.v3
پس از نصب بسته، می توانید از دستور import برای وارد کردن بسته به فایل های Go خود استفاده کنید.
import "gopkg.in/yaml.v3"
می توانید چندین نسخه YAML را بر اساس نسخه مشخصات YAML که می خواهید استفاده کنید انتخاب کنید.
خواندن و تجزیه ساختارهای داده YAML to Go
یکی از کارهای ضروری که می خواهید انجام دهید تجزیه ساختارهای داده YAML to Go است. بسته yaml یک API ساده و راحت برای انجام این کار ارائه می دهد.
این داده های YAML را در نظر بگیرید:
# output.yaml
person:
name: John Doe
age: 30
email: john.doe@example.com
شما می توانید یک ساختار متناظر با نام فیلدهای منطبق برای تجزیه داده های YAML در ساختار داده Go با بسته yaml تعریف کنید.
// Person struct represents the person key in YAML.
type Person struct {
Name string `yaml:"name"`
Age int`yaml:"age"`
Email string `yaml:"email"`
}
تگهای ساختار Yaml به نگاشت کلیدهای YAML به فیلدهای ساختار در طول عملیات تجزیه کمک میکنند.
در اینجا نحوه تجزیه و تحلیل داده های YAML در ساختار داده Go آمده است:
import (
"fmt"
"gopkg.in/yaml.v3"
"os"
)
func main() {
// read the output.yaml file
data, err := os.ReadFile("output.yaml")
if err != nil {
panic(err)
}
// create a person struct and deserialize the data into that struct
var person Person
if err := yaml.Unmarshal(data, &person); err != nil {
panic(err)
}
// print the fields to the console
fmt.Printf("Name: %s\n", person.Name)
fmt.Printf("Age: %d\n", person.Age)
fmt.Printf("Email: %s\n", person.Email)
}
تابع اصلی فایل output.yaml را با تابع ReadFile بسته ioutil می خواند. سپس یک نمونه از ساختار Person ایجاد می کند و داده ها را با روش Unmarshal بسته yaml در ساختار تجزیه می کند. تابع main فیلدها را از نمونه ساختار چاپ می کند. نتیجه این است:
درج داده ها در یک فایل YAML
می توانید از ساختارهای داده Go برای درج داده ها در فایل های YAML استفاده کنید. در اینجا نحوه وارد کردن داده ها به فایل YAML با نمونه ای از ساختار Person آمده است:
func main() {
// Create an instance of the Person struct with sample data
person := Person{
Name: "John Doe",
Age: 30,
Email: "john.doe@example.com",
}
// Serialize the person struct into YAML format
data, err := yaml.Marshal(&person)
if err != nil {
panic(err)
}
// Write the serialized YAML data to a file named "output.yaml"
err = os.WriteFile("output.yaml", data, 0644)
if err != nil {
panic(err)
}
fmt.Println("Data written to output.yaml")
}
متغیر person نمونه ای از نوع ساختار Person است. برای تبدیل ساختار به YAML از روش Marshal بسته yaml استفاده کنید. نمونه ساختار را می گیرد و نمایش YAML و یک خطا را برمی گرداند.
می توانید از تابع WriteFile بسته os برای نوشتن داده های YAML در فایل خود (در این مورد output.yaml) استفاده کنید.
پس از موفقیت آمیز بودن عملیات سریال سازی و نوشتن اطلاعات YAML، تابع اصلی پیامی را به کنسول چاپ می کند.
همانطور که با ساختارها انجام می دهید می توانید YAML را در نقشه ها مارشال و از هم جدا کنید.
در اینجا نمونه ای از مارشال کردن و حذف داده های YAML با نقشه ها آورده شده است:
package main
import (
"fmt"
"gopkg.in/yaml.v3"
)
func main() {
// Data for marshaling
data := map[string]interface{}{
"name": "John Doe",
"age": 30,
"email": "johndoe@example.com",
}
// Marshaling the data into YAML
yamlData, err := yaml.Marshal(data)
if err != nil {
fmt.Println("Error during marshaling:", err)
return
}
fmt.Println("Marshaled YAML data:")
fmt.Println(string(yamlData))
// Unmarshalling the YAML data into a map
var unmarshalledData map[string]interface{}
err = yaml.Unmarshal(yamlData, &unmarshalledData)
if err != nil {
fmt.Println("Error during unmarshalling:", err)
return
}
fmt.Println("\nUnmarshalled data:")
fmt.Println(unmarshalledData)
}
این فرآیند مانند انواع ساختار است، با این تفاوت که شما از نقشه ها برای نمایش داده ها استفاده می کنید. متدهای Unmarshal و Marshal برای هر دو نوع داده کار می کنند.
Docker Compose از فایل های YAML برای پیکربندی استفاده می کند
کار با فایل های YAML در Go یک رویکرد قدرتمند و انعطاف پذیر برای مدیریت داده های پیکربندی ارائه می دهد.
یکی از موارد استفاده برجسته برای فایلهای YAML، Docker Compose است که در آن یک فایل YAML به عنوان پیکربندی برای تعریف و مدیریت برنامههای Docker چند کانتینری عمل میکند.
Docker Compose از سادگی و خوانایی YAML برای تعریف سرویسها، شبکهها، حجمها و سایر مؤلفههای برنامههای کاربردی کانتینری استفاده میکند تا هماهنگی کانتینر را آسان کند.