Arbeiten mit YAML in Go (Golang) — Bibliothek gopkg.in/yaml.v3
\n\nYAML (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.
Installation der Bibliothek
\nFügen Sie zu Beginn das Paket zu Ihrem Projekt hinzu:
\ngo get gopkg.in/yaml.v3\nImportieren Sie es anschließend in Ihren Code:
\nimport "gopkg.in/yaml.v3"\n\nGrundlegende Strukturen für die Arbeit mit YAML
\nDie Bibliothek yaml.v3 unterstützt:
- \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
Beispiel 1: YAML aus einem String lesen
\nDer einfachste Fall ist das Parsen eines YAML-Strings in eine Go-Struktur:
\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("Server: %s:%d\\n", cfg.Server.Host, cfg.Server.Port)\n fmt.Printf("Datenbank: %s\\n", cfg.Database.User)\n}\n\nBeispiel 2: YAML in eine Datei schreiben
\nVerwenden Sie zum Schreiben von Daten in eine YAML-Datei yaml.Marshal und das Schreiben in das Dateisystem:
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\nBeispiel 3: Arbeiten mit verschachtelten und komplexen Strukturen
\nYAML unterstützt Listen, Map-Strukturen und tiefe Verschachtelung. Hier ist ein Beispiel für das Parsen einer Serverliste:
\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("Dienst %s: Ports %v, aktiv: %t\\n", s.Name, s.Ports, s.Enabled)\n }\n}\n\nStreaming-Lesen und -Schreiben (Decoder/Encoder)
\nVerwenden Sie für die Arbeit mit großen Dateien oder Datenströmen yaml.Decoder und yaml.Encoder:
package main\n\nimport (\n " Auch in der Bibliothek
Arbeiten mit Excel in C++: Bibliotheken, Beispiele und Werkzeuge
Reaktive Programmierung in Java: Die Reactor-Bibliothek
SMS-Versand mit Swift (iOS/macOS): API der MessageUI-Bibliothek
Dependency Injection Container für JavaScript (Node.js) — Awilix
Objektserialisierung in TypeScript: Ein vollständiger Leitfaden