Rumah >pembangunan bahagian belakang >Golang >golang ubah suai data yaml

golang ubah suai data yaml

WBOY
WBOYasal
2023-05-14 16:18:08879semak imbas

Untuk aplikasi yang dibangunkan menggunakan Golang, antara kaedah penyimpanan data biasa, fail data format YAML juga merupakan kaedah yang biasa digunakan. Oleh kerana fail dalam format YAML mempunyai kebolehbacaan yang baik dan struktur yang jelas, ia digunakan secara meluas dalam pelbagai senario Contohnya, fail konfigurasi Kubernetes disimpan dalam format YAML. Apabila anda perlu mengubah suai data format YAML, bagaimana menggunakan Golang untuk mencapainya? Berikut akan mengambil mengubah suai fail konfigurasi YAML Kubernetes sebagai contoh untuk memperkenalkan cara menggunakan Golang untuk melaksanakannya.

Import perpustakaan yang diperlukan

Anda perlu menggunakan pustaka "gopkg.in/yaml.v2" dalam kod untuk membaca dan mengubah suai data format YAML. Memandangkan modul Go, alat pengurusan pergantungan Golang, dilengkapi dengan fungsi pengurusan pergantungan sendiri, kami hanya perlu merujuk perpustakaan ini.

import (
    "fmt"
    "io/ioutil"
    "gopkg.in/yaml.v2"
)

Baca data YAML

Sebelum mengubah suai data YAML, anda perlu terlebih dahulu membaca data YAML Di sini anda boleh menggunakan fungsi ReadFile dalam perpustakaan ioutil untuk membaca fail. Memandangkan fail konfigurasi Kubernetes ialah dokumen yang boleh mengandungi berbilang objek, semua objek dalam fail perlu dipisahkan dengan "---".

func readYamlFile(filepath string) ([]map[interface{}]interface{}, error) {
    yamlFile, err := ioutil.ReadFile(filepath)
    if err != nil {
        return nil, err
    }
    var data []map[interface{}]interface{}
    for _, item := range bytes.Split(yamlFile, []byte("
---
")) {
        var obj map[interface{}]interface{}
        if err := yaml.Unmarshal(item, &obj); err != nil {
            return nil, err
        }
        data = append(data, obj)
    }
    return data, nil
}

Nilai pulangan bagi fungsi ini ialah jenis data []map[antara muka{}]Setiap elemen mewakili objek YAML Dalam fail konfigurasi Kubernetes, setiap objek biasanya mewakili Deployment. Perkhidmatan atau Pod, dsb.

Ubah suai data YAML

Andaikan kita perlu menukar Replika Deployment daripada 3 asal kepada 4, maka kita perlu mencari objek Deployment dan kemudian mengubah suai nilai medan Replicas. Memandangkan setiap medan data dalam format YAML ialah peta, sangat mudah untuk mengubah suai nilai medan tertentu Anda hanya perlu mencari peta di mana medan itu terletak, dan kemudian mengubah suai nilai peta ini. Di sini, apabila merentasi setiap objek YAML, kami menyemak sama ada yang semasa ialah Deployment yang perlu kami ubah suai. Jika ya, cari medan Replicas dan ubah suainya.

func modifyYamlData(data []map[interface{}]interface{}, objectName string, fieldName string, fieldValue interface{}) error {
    for _, obj := range data {
        if obj["kind"] == "Deployment" && obj["metadata"].(map[interface{}]interface{})["name"] == objectName {
            spec := obj["spec"].(map[interface{}]interface{})
            replicas := spec["replicas"].(int)
            if replicas != fieldValue {
                spec["replicas"] = fieldValue
                yamlData, err := yaml.Marshal(data)
                if err != nil {
                    return err
                }
                return ioutil.WriteFile("k8s.yaml", yamlData, 0644)
            }
            break
        }
    }
    return nil
}

Parameter fungsi ini ialah data YAML yang dibaca, nama objek, nama atribut dan nilai atribut yang perlu diubah suai. Jika objek yang perlu diubah suai ditemui dan diubah suai, ia boleh ditulis terus ke fail.

Kod lengkap

Berikut ialah atur cara lengkap untuk mengubah suai atribut Replicas Deployment dalam fail konfigurasi Kubernetes. Anda boleh melanjutkan dan mengubah suai atribut lain atas dasar ini.

package main

import (
    "bytes"
    "fmt"
    "io/ioutil"
  
    "gopkg.in/yaml.v2"
)

func readYamlFile(filepath string) ([]map[interface{}]interface{}, error) {
    yamlFile, err := ioutil.ReadFile(filepath)
    if err != nil {
        return nil, err
    }
    var data []map[interface{}]interface{}
    for _, item := range bytes.Split(yamlFile, []byte("
---
")) {
        var obj map[interface{}]interface{}
        if err := yaml.Unmarshal(item, &obj); err != nil {
            return nil, err
        }
        data = append(data, obj)
    }
    return data, nil
}

func modifyYamlData(data []map[interface{}]interface{}, objectName string, fieldName string, fieldValue interface{}) error {
    for _, obj := range data {
        if obj["kind"] == "Deployment" && obj["metadata"].(map[interface{}]interface{})["name"] == objectName {
            spec := obj["spec"].(map[interface{}]interface{})
            replicas := spec["replicas"].(int)
            if replicas != fieldValue {
                spec["replicas"] = fieldValue
                yamlData, err := yaml.Marshal(data)
                if err != nil {
                    return err
                }
                return ioutil.WriteFile("k8s.yaml", yamlData, 0644)
            }
            break
        }
    }
    return nil
}

func main() {
    data, err := readYamlFile("k8s.yaml")
    if err != nil {
        fmt.Println(err)
        return
    }
    if err := modifyYamlData(data, "nginx", "replicas", 4); err != nil {
        fmt.Println(err)
        return
    }
}

Ringkasan

Melalui kod di atas, kita dapat melihat bahawa agak mudah untuk menggunakan Golang untuk mengubah suai data dalam format YAML. Berbanding dengan JSON, YAML lebih mudah dibaca dan diedit, dan Golang juga menyediakan sejumlah besar alat mudah untuk melaksanakan operasi membaca dan menulis pada jenis data yang kompleks. Oleh itu, untuk senario aplikasi yang perlu memproses data yang kompleks, menggunakan Golang untuk memproses data YAML adalah sangat sesuai.

Atas ialah kandungan terperinci golang ubah suai data yaml. 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
Artikel sebelumnya:fungsi golang tidak berubahArtikel seterusnya:fungsi golang tidak berubah