Golang を使用して開発されたアプリケーションでは、一般的なデータ保存方法のうち、YAML 形式のデータ ファイルもよく使用される方法です。 YAML 形式のファイルは可読性が高く、構造が明確であるため、Kubernetes の構成ファイルは YAML 形式で保存されるなど、さまざまなシナリオで広く使用されています。 YAML 形式のデータを変更する必要がある場合、Golang を使用してそれを実現するにはどうすればよいでしょうか?以下では、Kubernetes の YAML 設定ファイルの変更を例に、Golang を使用して実装する方法を紹介します。
YAML 形式でデータを読み取り、変更するには、コード内で「gopkg.in/yaml.v2」ライブラリを使用する必要があります。 Golang の依存関係管理ツールである Go モジュールには独自の依存関係管理機能が付属しているため、このライブラリを参照するだけで済みます。
import ( "fmt" "io/ioutil" "gopkg.in/yaml.v2" )
YAML データを変更する前に、まず YAML データを読み取る必要があります。ここでは、ioutil ライブラリの ReadFile 関数を使用してファイルを読み取ることができます。 Kubernetes 構成ファイルは複数のオブジェクトを含むことができるドキュメントであるため、ファイル内のすべてのオブジェクトは「---」で区切る必要があります。
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 }
この関数の戻り値は、[]map[interface{}]interface{} タイプのデータです。各要素は YAML オブジェクトを表します。Kubernetes 設定ファイルでは、通常、各オブジェクトはデプロイメントを表します。サービスやポッドなど
デプロイメントのレプリカを元の 3 から 4 に変更する必要があるとします。次に、Deployment オブジェクトを見つけて、[レプリカ] フィールドの値を変更する必要があります。 YAML 形式のデータの各フィールドはマップであるため、フィールドの値の変更は非常に簡単で、フィールドが配置されているマップを見つけて、マップの値を変更するだけです。ここでは、各 YAML オブジェクトを走査するときに、現在のものが変更する必要があるデプロイメントであるかどうかを確認し、そうである場合は、「Replicas」フィールドを見つけて変更します。
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 }
この関数のパラメータは、読み取られた YAML データ、変更する必要があるオブジェクト名、属性名、および属性値です。変更する必要があるオブジェクトが見つかって変更された場合は、そのオブジェクトをファイルに直接書き込むことができます。
以下は、Kubernetes 構成ファイル内のデプロイメントのレプリカ属性を変更するための完全なプログラムです。これに基づいて他の属性を拡張および変更できます。
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 } }
上記のコードを通して、Golang を使用して YAML 形式のデータを変更するのが比較的簡単であることがわかります。 JSON と比較して、YAML は読み取りと編集が容易であり、Golang は、複雑なデータ型の読み取りおよび書き込み操作を実装するための便利なツールを多数提供します。したがって、複雑なデータを処理する必要があるアプリケーション シナリオでは、Golang を使用して YAML データを処理することが非常に適しています。
以上がgolangはyamlデータを変更しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。