Heim > Artikel > Backend-Entwicklung > Schlüssel/Wert-Paare können nicht aus der über YAML erhaltenen Karte extrahiert werden
Der PHP-Editor Xiaoxin stößt häufig auf ein Problem, wenn er YAML zum Abrufen von Zuordnungen verwendet. Das heißt, die Schlüssel/Wert-Paare können nicht aus der über YAML erhaltenen Zuordnung extrahiert werden. Dieses Problem tritt in der tatsächlichen Entwicklung sehr häufig auf und kann dazu führen, dass die Konfigurationsdatei nicht richtig gelesen werden kann oder die richtigen Daten nicht abgerufen werden können. In diesem Artikel werden wir uns mit der Ursache dieses Problems befassen und einige Lösungen bereitstellen, die Entwicklern dabei helfen, Schlüssel/Wert-Paare bei der Verwendung von YAML reibungsloser zu extrahieren.
Ich verwende das Goldmark-Meta-Paket, um Yaml-Dateien zu lesen. Was mich interessiert, ist Folgendes In Yaml:
burger: - a: ay - b: bee - c: see
Ich möchte auf Schlüssel und Werte zugreifen Zurück zur Benutzeroberfläche: Ich stecke fest. Die Iteration gibt mir a zurück eine Liste von Schlüssel/Wert-Paaren, aber ich habe keine Ich weiß, wie ich an Informationen komme, wenn ich es nicht weiß Kennen Sie die wichtigsten Namen im Voraus. Das Programm gibt Folgendes aus:
func (c *config) burger() string { // c.pagefm is type map[string]interface{} b, ok := c.pagefm["burger"].([]interface{}) if !ok { // no burger entry in yaml return "" } debug("burger list has %v items:\n%v", len(b), b) debug("type: %v", reflect.typeof(b)) for i := 0; i < len(b); i++ { debug("%v", b[i]) } return "" }
Burger list has 3 items: [map[a:ay] map[b:bee] map[c:see]] Type: []interface {} map[a:ay] map[b:bee] map[c:see]
Wie erhalte ich eine Schlüssel- und Wertzeichenfolge?
In Ihren Yaml-Daten haben Sie ein Element in einem Schlüssel (burger
),其值是映射列表(每个映射都有一个键)。我们可以像这样迭代 burger
:
b, ok := c.pagefm["burger"].([]interface{}) if !ok { return "" } for _, item := range burger { ... }
Für jedes item
können wir die verfügbaren Schlüssel und Werte durchlaufen:
for _, item := range burger { for k, v := range item.(map[interface{}]interface{}) { ... } }
Wir können fmt.sprintf
将 interface{}
中的键和值转换为 string
:
for _, item := range burger { for k, v := range item.(map[interface{}]interface{}) { k_str := fmt.sprintf("%v", k) v_str := fmt.sprintf("%v", v) fmt.printf("key %s value %s\n", k_str, v_str) } }
Ausgehend mit dem Beispielcode goldmark-meta
von habe ich dieses Beispiel zusammengestellt:
package main import ( "bytes" "fmt" "github.com/yuin/goldmark" meta "github.com/yuin/goldmark-meta" "github.com/yuin/goldmark/parser" ) func main() { markdown := goldmark.new( goldmark.withextensions( meta.meta, ), ) source := `--- burger: - a: ay - b: bee - c: see --- # hello goldmark-meta ` var buf bytes.buffer context := parser.newcontext() if err := markdown.convert([]byte(source), &buf, parser.withcontext(context)); err != nil { panic(err) } metadata := meta.get(context) burger := metadata["burger"].([]interface{}) for _, item := range burger { for k, v := range item.(map[interface{}]interface{}) { k_str := fmt.sprintf("%v", k) v_str := fmt.sprintf("%v", v) fmt.printf("key %s value %s\n", k_str, v_str) } } }
Was ergibt:
key a value ay key b value bee key c value see
Das obige ist der detaillierte Inhalt vonSchlüssel/Wert-Paare können nicht aus der über YAML erhaltenen Karte extrahiert werden. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!