Arbeiten mit YAML in Go (Golang) — Bibliotheken gopkg.in/yaml.v3 und encoding/json

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Arbeiten mit YAML in Go (Golang) — Bibliothek gopkg.in/yaml.v3

\n\n

YAML (YAML Ain't Markup Language) ist ein beliebtes Daten-Serialisierungsformat, das häufig für Konfigurationsdateien, API-Beschreibungen (OpenAPI/Swagger), CI/CD-Pipelines (GitLab CI, GitHub Actions) und Docker Compose verwendet wird. Im Go-Ökosystem (Golang) gibt es keine Standardbibliothek für die Arbeit mit YAML, daher verwenden Entwickler die leistungsstarke und stabile Drittanbieter-Bibliothek gopkg.in/yaml.v3. In diesem Artikel werden wir im Detail besprechen, wie man YAML in Go liest, schreibt und verarbeitet.

\n\n

Installation der Bibliothek

\n

Fügen Sie zu Beginn das Paket zu Ihrem Projekt hinzu:

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

Importieren Sie es anschließend in Ihren Code:

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

Grundlegende Strukturen für die Arbeit mit YAML

\n

Die Bibliothek yaml.v3 unterstützt:

\n
    \n
  • Marshalling (Marshal) — Konvertierung von Go-Strukturen in einen YAML-String.
  • \n
  • Unmarshalling (Unmarshal) — Parsen eines YAML-Strings in eine Go-Struktur.
  • \n
  • Streaming-Parsing (Decoder/Encoder) für die Arbeit mit Dateien.
  • \n
  • Tags yaml:"fieldname" zur Konfiguration von Feldnamen.
  • \n
\n\n

Beispiel 1: YAML aus einem String lesen

\n

Der einfachste Fall ist das Parsen eines YAML-Strings in eine Go-Struktur:

\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("Server: %s:%d\\n", cfg.Server.Host, cfg.Server.Port)\n    fmt.Printf("Datenbank: %s\\n", cfg.Database.User)\n}
\n\n

Beispiel 2: YAML in eine Datei schreiben

\n

Verwenden Sie zum Schreiben von Daten in eine YAML-Datei yaml.Marshal und das Schreiben in das Dateisystem:

\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("Datei config.yaml erstellt")\n}
\n\n

Beispiel 3: Arbeiten mit verschachtelten und komplexen Strukturen

\n

YAML unterstützt Listen, Map-Strukturen und tiefe Verschachtelung. Hier ist ein Beispiel für das Parsen einer Serverliste:

\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("Dienst %s: Ports %v, aktiv: %t\\n", s.Name, s.Ports, s.Enabled)\n    }\n}
\n\n

Streaming-Lesen und -Schreiben (Decoder/Encoder)

\n

Verwenden Sie für die Arbeit mit großen Dateien oder Datenströmen yaml.Decoder und yaml.Encoder:

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

Empfehlungen