Heim  >  Artikel  >  Backend-Entwicklung  >  Array aus Yaml-Datei in GoLang lesen

Array aus Yaml-Datei in GoLang lesen

WBOY
WBOYnach vorne
2024-02-08 23:45:101263Durchsuche

从 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{}
}

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"}

Fehler

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

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"`
}

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"}

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)
}

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen