Travailler avec YAML en Go (Golang) — bibliothèque gopkg.in/yaml.v3
\n\nYAML (YAML Ain't Markup Language) est un format de sérialisation de données populaire, souvent utilisé pour les fichiers de configuration, la description d'API (OpenAPI/Swagger), les pipelines CI/CD (GitLab CI, GitHub Actions) et Docker Compose. Dans l'écosystème Go (Golang), il n'existe pas de bibliothèque standard pour travailler avec YAML, c'est pourquoi les développeurs utilisent la bibliothèque tierce puissante et stable gopkg.in/yaml.v3. Dans cet article, nous allons détailler comment lire, écrire et traiter YAML en Go.
Installation de la bibliothèque
\nPour commencer, ajoutez le package à votre projet :
\ngo get gopkg.in/yaml.v3\nEnsuite, importez-le dans votre code :
\nimport "gopkg.in/yaml.v3"\n\nStructures de base pour travailler avec YAML
\nLa bibliothèque yaml.v3 prend en charge :
- \n
- Marshaling (Marshal) — conversion de structures Go en chaîne YAML. \n
- Unmarshaling (Unmarshal) — parsing d'une chaîne YAML en structure Go. \n
- Parsing par flux (Decoder/Encoder) pour travailler avec des fichiers. \n
- Tags
yaml:"fieldname"pour configurer les noms des champs. \n
Exemple 1 : Lecture de YAML depuis une chaîne
\nLe cas le plus simple est d'analyser une chaîne YAML dans une structure Go :
\npackage main\n\nimport (\n "fmt"\n "gopkg.in/yaml.v3"\n)\n\ntype Config struct {\n Server struct {\n Port int `yaml:"port"`\n Host string `yaml:"host"`\n } `yaml:"server"`\n Database struct {\n User string `yaml:"user"`\n Pass string `yaml:"pass"`\n } `yaml:"database"`\n}\n\nfunc main() {\n yamlData := `\nserver:\n port: 8080\n host: "localhost"\ndatabase:\n user: "admin"\n pass: "secret"\n`\n var cfg Config\n err := yaml.Unmarshal([]byte(yamlData), &cfg)\n if err != nil {\n panic(err)\n }\n fmt.Printf("Serveur : %s:%d\\n", cfg.Server.Host, cfg.Server.Port)\n fmt.Printf("Base de données : %s\\n", cfg.Database.User)\n}\n\nExemple 2 : Écriture de YAML dans un fichier
\nPour écrire des données dans un fichier YAML, utilisez yaml.Marshal et l'écriture dans le système de fichiers :
package main\n\nimport (\n "os"\n "gopkg.in/yaml.v3"\n)\n\ntype AppConfig struct {\n Name string `yaml:"name"`\n Version string `yaml:"version"`\n Debug bool `yaml:"debug"`\n}\n\nfunc main() {\n config := AppConfig{\n Name: "MyApp",\n Version: "1.0.0",\n Debug: true,\n }\n\n data, err := yaml.Marshal(&config)\n if err != nil {\n panic(err)\n }\n\n err = os.WriteFile("config.yaml", data, 0644)\n if err != nil {\n panic(err)\n }\n println("Fichier config.yaml créé")\n}\n\nExemple 3 : Travailler avec des structures imbriquées et complexes
\nYAML prend en charge les listes, les structures map et l'imbrication profonde. Voici un exemple de parsing d'une liste de serveurs :
\npackage main\n\nimport (\n "fmt"\n "gopkg.in/yaml.v3"\n)\n\ntype Service struct {\n Name string `yaml:"name"`\n Ports []int `yaml:"ports"`\n Enabled bool `yaml:"enabled"`\n}\n\ntype Deployment struct {\n Version string `yaml:"version"`\n Services []Service `yaml:"services"`\n}\n\nfunc main() {\n input := `\nversion: "2.1"\nservices:\n - name: web\n ports: [80, 443]\n enabled: true\n - name: api\n ports: [3000]\n enabled: false\n`\n var dep Deployment\n if err := yaml.Unmarshal([]byte(input), &dep); err != nil {\n panic(err)\n }\n\n for _, s := range dep.Services {\n fmt.Printf("Service %s : ports %v, actif : %t\\n", s.Name, s.Ports, s.Enabled)\n }\n}\n\nLecture et écriture par flux (Decoder/Encoder)
\nPour travailler avec de gros fichiers ou des flux de données, utilisez yaml.Decoder et yaml.Encoder :
package main\n\nimport (\n "