Maison >développement back-end >Golang >golang modifie les données yaml

golang modifie les données yaml

WBOY
WBOYoriginal
2023-05-14 16:18:08879parcourir

Pour les applications développées à l'aide de Golang, parmi les méthodes de stockage de données courantes, les fichiers de données au format YAML sont également une méthode couramment utilisée. Étant donné que les fichiers au format YAML ont une bonne lisibilité et une structure claire, ils sont largement utilisés dans divers scénarios. Par exemple, les fichiers de configuration Kubernetes sont stockés au format YAML. Lorsque vous devez modifier des données au format YAML, comment utiliser Golang pour y parvenir ? Ce qui suit prendra la modification du fichier de configuration YAML de Kubernetes comme exemple pour présenter comment utiliser Golang pour l'implémenter.

Importez les bibliothèques nécessaires

Vous devez utiliser la bibliothèque "gopkg.in/yaml.v2" dans le code pour lire et modifier les données au format YAML. Étant donné que l'outil de gestion des dépendances de Golang, go modules, est livré avec sa propre fonction de gestion des dépendances, il nous suffit de référencer cette bibliothèque.

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

Lire les données YAML

Avant de modifier les données YAML, vous devez d'abord lire les données YAML Ici, vous pouvez utiliser la fonction ReadFile de la bibliothèque ioutil pour lire le fichier. Étant donné que le fichier de configuration Kubernetes est un document pouvant contenir plusieurs objets, tous les objets du fichier doivent être séparés par "---".

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
}

La valeur de retour de cette fonction est un type de données []map[interface{}]interface{}. Chaque élément représente un objet YAML dans le fichier de configuration Kubernetes, chaque objet représente généralement un déploiement, un service ou un pod, etc. .

Modifier les données YAML

Supposons que nous devions changer les réplicas d'un déploiement des 3 à 4 d'origine, nous devons alors rechercher l'objet Déploiement, puis modifier la valeur du champ Réplicas. Puisque chaque champ de données au format YAML est une carte, modifier la valeur d'un champ est très simple. Il suffit de trouver la carte où se trouve le champ, puis de modifier la valeur de la carte. Ici, lors de la traversée de chaque objet YAML, nous vérifions si l'objet actuel est le déploiement que nous devons modifier. Si tel est le cas, recherchez le champ Réplicas et modifiez-le.

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
}

Les paramètres de cette fonction sont les données YAML lues, le nom de l'objet, le nom de l'attribut et la valeur de l'attribut qui doivent être modifiés. Si l'objet à modifier est trouvé et modifié, il peut être écrit directement dans le fichier.

Code complet

Ce qui suit est un programme complet pour modifier l'attribut Réplicas du Déploiement dans le fichier de configuration Kubernetes. Vous pouvez étendre et modifier d'autres attributs sur cette base.

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
    }
}

Résumé

Grâce au code ci-dessus, nous pouvons voir qu'il est relativement simple d'utiliser Golang pour modifier des données au format YAML. Comparé à JSON, YAML est plus facile à lire et à modifier, et Golang fournit également un grand nombre d'outils pratiques pour mettre en œuvre des opérations de lecture et d'écriture sur des types de données complexes. Par conséquent, pour les scénarios d'application nécessitant de traiter des données complexes, l'utilisation de Golang pour traiter les données YAML est très appropriée.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Article précédent:fonction golang immuableArticle suivant:fonction golang immuable