Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Menghuraikan YAML dengan Kekunci Dinamik dalam Go?

Bagaimana untuk Menghuraikan YAML dengan Kekunci Dinamik dalam Go?

Linda Hamilton
Linda Hamiltonasal
2024-11-04 02:28:29319semak imbas

How to Parse YAML with Dynamic Keys in 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(&params); 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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn