Rumah > Artikel > pembangunan bahagian belakang > Bagaimana untuk Menghuraikan YAML dengan Kekunci Dinamik dalam Go?
Penghuraian Kunci Dinamik dalam YAML dengan Golang
Pengenalan
YAML (YAML Ain't Markup Language) ialah format siri data yang digunakan secara meluas yang membenarkan perwakilan data yang fleksibel. Walau bagaimanapun, menghuraikan fail YAML dengan kekunci dinamik (iaitu, kekunci yang mungkin berbeza-beza) menimbulkan cabaran dalam Go kerana bahasa sangat bergantung pada struktur ditaip secara statik.
Penerangan Masalah
Anda mempunyai fail YAML dengan kekunci mewakili versi yang berbeza (cth., V1, V2, V3). Pengguna boleh menentukan versi yang mereka sokong, dan kekunci mungkin tidak mengikut urutan atau melangkau versi. Anda ingin menghuraikan fail YAML ini ke dalam struct Go, tetapi medan struct mesti sepadan dengan kekunci dinamik.
Pendekatan Salah
Pada mulanya, anda cuba menghuraikan YAML fail ke dalam struct Persekitaran, menjangkakan kunci hadir pada peringkat akar. Walau bagaimanapun, jenis sebenar unsur akar ialah peta rentetan ( mewakili nama persekitaran) kepada struct Persekitaran.
Penyelesaian
Untuk menghuraikan YAML dengan kekunci dinamik, anda perlu menggunakan kaedah UnmarshalYAML tersuai pada struct yang akan menghuraikan kunci dan membina struct yang betul. Dalam kes ini, struct Persekitaran memerlukan kaedah UnmarshalYAML untuk menyahmarshal akar sebagai peta dan kemudian menghuraikan persekitaran individu.
Sampel Kod
Berikut ialah contoh kaedah UnmarshalYAML tersuai untuk struct Persekitaran:
<code class="go">func (e *Environment) UnmarshalYAML(unmarshal func(interface{}) error) error { var params struct { SkipHeaderValidation bool `yaml:"skip-header-validation"` } if err := unmarshal(¶ms); err != nil { return err } var versions map[string]MajorVersion if err := unmarshal(&versions); err != nil { // Here we expect an error because a boolean cannot be converted to a MajorVersion if _, ok := err.(*yaml.TypeError); !ok { return err } } e.SkipHeaderValidation = params.SkipHeaderValidation e.Versions = versions return nil }</code>
Kaedah ini mula-mula menyahmarshal medan Boolean SkipHeaderValidation. Kemudian, ia cuba untuk menyahmarshal seluruh data ke dalam peta nama versi kepada struct MajorVersion. Walau bagaimanapun, kerana data yang tidak dikawal adalah gabungan struct Booleans dan MajorVersion, yaml.TypeError akan dilemparkan. Kod tersebut mengabaikan ralat ini dan memberikan peta versi yang tidak dimarshallkan kepada medan Versi struct Persekitaran.
Contoh Penggunaan
Dengan kaedah UnmarshalYAML tersuai, anda boleh kini nyahmarshal data YAML dengan betul:
<code class="go">var e map[string]Environment if err := yaml.Unmarshal([]byte(data), &e); err != nil { fmt.Println(err.Error()) } fmt.Printf("%#v\n", e)</code>
Ini akan menghasilkan output berikut:
map[string]main.Environment{ "development": { SkipHeaderValidation: true, Versions: { "V2": { Current: "2.0.0", MimeTypes: {"application/vnd.company.jk.identity+json;", "application/vnd.company.jk.user+json;", "application/vnd.company.jk.role+json;", "application/vnd.company.jk.scope+json;", "application/vnd.company.jk.test+json;"}, SkipVersionValidation: false, SkipMimeTypeValidation: false, }, "V1": { Current: "1.0.0", MimeTypes: {"application/vnd.company.jk.identity+json;", "application/vnd.company.jk.user+json;", "application/vnd.company.jk.role+json;", "application/vnd.company.jk.scope+json;", "application/vnd.company.jk.test+json;"}, SkipVersionValidation: true, SkipMimeTypeValidation: true, }, }, }, }
Ini menunjukkan penghuraian fail YAML yang berjaya dengan kekunci dinamik ke dalam struct Go.
Atas ialah kandungan terperinci Bagaimana untuk Menghuraikan YAML dengan Kekunci Dinamik dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!