Für Anwendungen, die mit Golang entwickelt wurden, sind neben den gängigen Datenspeichermethoden auch Datendateien im YAML-Format eine häufig verwendete Methode. Da Dateien im YAML-Format gut lesbar und klar strukturiert sind, werden sie häufig in verschiedenen Szenarien verwendet. Beispielsweise werden Kubernetes-Konfigurationsdateien im YAML-Format gespeichert. Wenn Sie Daten im YAML-Format ändern müssen, wie können Sie dies mit Golang erreichen? Im Folgenden wird die Änderung der YAML-Konfigurationsdatei von Kubernetes als Beispiel verwendet, um vorzustellen, wie Golang zur Implementierung verwendet wird.
Sie müssen die Bibliothek „gopkg.in/yaml.v2“ im Code verwenden, um Daten im YAML-Format zu lesen und zu ändern. Da die Go-Module des Abhängigkeitsverwaltungstools von Golang über eine eigene Abhängigkeitsverwaltungsfunktion verfügen, müssen wir nur auf diese Bibliothek verweisen.
import ( "fmt" "io/ioutil" "gopkg.in/yaml.v2" )
Bevor Sie die YAML-Daten ändern, müssen Sie zunächst die YAML-Daten lesen. Hier können Sie die ReadFile-Funktion in der ioutil-Bibliothek verwenden, um die Datei zu lesen. Da es sich bei der Kubernetes-Konfigurationsdatei um ein Dokument handelt, das mehrere Objekte enthalten kann, müssen alle Objekte in der Datei durch „---“ getrennt werden.
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 }
Der Rückgabewert dieser Funktion ist ein Datentyp []map[interface{}]interface{}. Jedes Element stellt ein YAML-Objekt dar. In der Kubernetes-Konfigurationsdatei stellt jedes Objekt normalerweise eine Bereitstellung, einen Dienst oder einen Pod usw. dar .
Angenommen, wir müssen die Replikate einer Bereitstellung von ursprünglich 3 auf 4 ändern, dann müssen wir das Bereitstellungsobjekt finden und dann den Wert des Felds „Replikate“ ändern. Da es sich bei jedem Datenfeld im YAML-Format um eine Karte handelt, ist es sehr einfach, den Wert eines bestimmten Felds zu ändern. Sie müssen lediglich die Karte finden, in der sich das Feld befindet, und dann den Wert dieser Karte ändern. Hier prüfen wir beim Durchlaufen jedes YAML-Objekts, ob es sich bei dem aktuellen um das Deployment handelt, das wir ändern müssen. Wenn ja, suchen wir das Feld „Replicas“ und ändern es.
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 }
Die Parameter dieser Funktion sind die gelesenen YAML-Daten, der Objektname, der Attributname und der Attributwert, die geändert werden müssen. Wenn das zu ändernde Objekt gefunden und geändert wird, kann es direkt in die Datei geschrieben werden.
Das Folgende ist ein vollständiges Programm zum Ändern des Replicas-Attributs der Bereitstellung in der Kubernetes-Konfigurationsdatei. Auf dieser Basis können Sie weitere Attribute erweitern und modifizieren.
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 } }
Anhand des obigen Codes können wir sehen, dass es relativ einfach ist, Golang zum Ändern von Daten im YAML-Format zu verwenden. Im Vergleich zu JSON ist YAML einfacher zu lesen und zu bearbeiten, und Golang bietet außerdem eine große Anzahl praktischer Tools zum Implementieren von Lese- und Schreibvorgängen für komplexe Datentypen. Daher ist die Verwendung von Golang zur Verarbeitung von YAML-Daten für Anwendungsszenarien, die komplexe Daten verarbeiten müssen, sehr gut geeignet.
Das obige ist der detaillierte Inhalt vonGolang Yaml-Daten ändern. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!