Array aus Yaml-Datei in GoLang lesen

WBOY
Freigeben: 2024-02-08 23:45:10
nach vorne
1228 Leute haben es durchsucht

从 GoLang 中的 yaml 文件读取数组

php-Editor Banana stellt Ihnen in diesem Artikel vor, wie Sie Arrays aus Yaml-Dateien in GoLang lesen. GoLang ist eine leistungsstarke Programmiersprache und Yaml-Dateien sind ein Dateiformat, das zum Speichern strukturierter Daten verwendet wird. Durch das Lesen des Arrays in der Yaml-Datei können wir die darin enthaltenen Daten einfach abrufen und eine anschließende Verarbeitung durchführen. In diesem Artikel werden die Schritte zum Lesen einer Yaml-Datei ausführlich erläutert und Beispielcode bereitgestellt, damit Sie es besser verstehen. Egal, ob Sie Anfänger oder erfahrener Entwickler sind, dieser Artikel liefert Ihnen praktische Tipps und Wissen, das Sie leicht auf Ihre Projekte anwenden können. Lasst uns gleich loslegen!

Frageninhalt

Ich versuche, eine Yaml-Datei zu lesen, die ein Array von Objekten enthält

package config

import (
    "gopkg.in/yaml.v3"
    "log"
    "os"
    "path/filepath"
    "runtime"
)

type documentationinfo struct {
    docs []document `yaml:"document"`
}

type document struct {
    title    string `yaml:"title"`
    filename string `yaml:"filename"`
}

func (c *documentationinfo) init() map[string]document {
    _, b, _, _ := runtime.caller(0)
    basepath := filepath.dir(b)

    yamlfile, err := os.readfile(basepath + "/documentation.yaml")
    if err != nil {
        log.printf("yamlfile.get err   #%v ", err)
    }
    err = yaml.unmarshal(yamlfile, c.docs)
    if err != nil {
        log.fatalf("unmarshal: %v", err)
    }

    docinfo := make(map[string]document)

    for _, doc := range c.docs {
        docinfo[doc.filename] = doc
    }

    return docinfo
}
func newdocumentconfig() *documentationinfo {
    return &documentationinfo{}
}
Nach dem Login kopieren

yaml-Datei

documentationinfo:
  document:
    - {filename: "foo.md", title: "i am an foo title"}
    - {filename: "test.md", title: "i am an test title"}
    - {filename: "bar.md", title: "i am an bar title"}
    - {filename: "nice.md", title: "i am an nice title"}
Nach dem Login kopieren
Nach dem Login kopieren

Fehler

2023/06/27 13:44:44 Unmarshal: yaml: unmarshal errors:
  line 1: cannot unmarshal !!map into []config.Document
Nach dem Login kopieren

Ich bin mir nicht sicher, ob das Problem an der Syntax der Yaml-Datei liegt, da sie JSON ähnelt, aber die Querverweisdokumentation sieht korrekt aus.

Für Vorschläge wäre ich sehr dankbar ...

Problemumgehung

Sie haben den äußersten Container mit einem Array von document 键的映射,其中包含 documents:

definiert
type documentationinfo struct {
  docs []document `yaml:"document"`
}
Nach dem Login kopieren

Aber das ist nicht die Struktur der Eingabedaten, sie sieht so aus:

documentationinfo:
  document:
    - {filename: "foo.md", title: "i am an foo title"}
    - {filename: "test.md", title: "i am an test title"}
    - {filename: "bar.md", title: "i am an bar title"}
    - {filename: "nice.md", title: "i am an nice title"}
Nach dem Login kopieren
Nach dem Login kopieren

Das äußere Element ist ein Include documentationinfo 键的映射(该键的值是带有 document 键的映射)。您需要像这样重新定义您的类型(我已将其转换为 package main, damit ich es zum Testen lokal ausführen kann):

package main

import (
    "fmt"
    "log"
    "os"
    "path/filepath"
    "runtime"

    "gopkg.in/yaml.v3"
)

type documentationinfofile struct {
    documentationinfo documentationinfo `yaml:"documentationinfo"`
}

type documentationinfo struct {
    docs []document `yaml:"document"`
}

type document struct {
    title    string `yaml:"title"`
    filename string `yaml:"filename"`
}

func (docinfo *documentationinfofile) init() map[string]document {
    _, b, _, _ := runtime.caller(0)
    basepath := filepath.dir(b)

    yamlfile, err := os.readfile(basepath + "/documentation.yaml")
    if err != nil {
        log.printf("yamlfile.get err   #%v ", err)
    }
    err = yaml.unmarshal(yamlfile, docinfo)
    if err != nil {
        log.fatalf("unmarshal: %v", err)
    }

    docmap := make(map[string]document)
    for _, doc := range docinfo.documentationinfo.docs {
        docmap[doc.filename] = doc
    }

    return docmap

}
func newdocumentconfig() *documentationinfofile {
    return &documentationinfofile{}
}

func main() {
    d := newdocumentconfig()
    docmap := d.init()
    fmt.printf("%+v\n", docmap)
}
Nach dem Login kopieren

Das Ausführen des obigen Codes führt zu Folgendem:

65bcd85880 Gebühr

Das obige ist der detaillierte Inhalt vonArray aus Yaml-Datei in GoLang lesen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!