Travailler avec YAML en Go (Golang) — bibliothèques gopkg.in/yaml.v3 et encoding/json

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Travailler avec YAML en Go (Golang) — bibliothèque gopkg.in/yaml.v3

\n\n

YAML (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.

\n\n

Installation de la bibliothèque

\n

Pour commencer, ajoutez le package à votre projet :

\n
go get gopkg.in/yaml.v3
\n

Ensuite, importez-le dans votre code :

\n
import "gopkg.in/yaml.v3"
\n\n

Structures de base pour travailler avec YAML

\n

La bibliothèque yaml.v3 prend en charge :

\n
    \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
\n\n

Exemple 1 : Lecture de YAML depuis une chaîne

\n

Le cas le plus simple est d'analyser une chaîne YAML dans une structure Go :

\n
package 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\n

Exemple 2 : Écriture de YAML dans un fichier

\n

Pour écrire des données dans un fichier YAML, utilisez yaml.Marshal et l'écriture dans le système de fichiers :

\n
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\n

Exemple 3 : Travailler avec des structures imbriquées et complexes

\n

YAML prend en charge les listes, les structures map et l'imbrication profonde. Voici un exemple de parsing d'une liste de serveurs :

\n
package 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\n

Lecture et écriture par flux (Decoder/Encoder)

\n

Pour travailler avec de gros fichiers ou des flux de données, utilisez yaml.Decoder et yaml.Encoder :

\n
package main\n\nimport (\n    "                    

Recommendations