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.
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" )
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. .
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.
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 } }
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!