L'éditeur php Xiaoxin rencontre souvent un problème lors de l'utilisation de YAML pour obtenir des mappages, c'est-à-dire que les paires clé/valeur ne peuvent pas être extraites du mappage obtenu via YAML. Ce problème est très courant dans le développement réel et peut empêcher la lecture correcte du fichier de configuration ou l'obtention des données correctes. Dans cet article, nous examinerons la cause de ce problème et proposerons quelques solutions pour aider les développeurs à extraire plus facilement les paires clé/valeur lors de l'utilisation de YAML.
J'utilise le package goldmark-meta pour lire les fichiers yaml. Ce qui m'intéresse c'est ça En yaml :
burger: - a: ay - b: bee - c: see
Je souhaite accéder aux clés et aux valeurs De retour à l'interface, je suis bloqué. L'itération me renvoie un une liste de paires clé/valeur, mais je n'en ai pas je sais comment obtenir des informations quand je ne sais pas Connaissez les noms clés à l’avance. Le programme imprime ce qui suit :
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]
Comment obtenir une chaîne de clé et de valeur ?
Dans vos données yaml, vous avez un élément dans une clé (burger
),其值是映射列表(每个映射都有一个键)。我们可以像这样迭代 burger
:
b, ok := c.pagefm["burger"].([]interface{}) if !ok { return "" } for _, item := range burger { ... }
Pour chaque item
, nous pouvons parcourir les clés et valeurs disponibles :
for _, item := range burger { for k, v := range item.(map[interface{}]interface{}) { ... } }
Nous pouvons utiliser 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) } }
En commençant avec l'exemple de code goldmark-meta
de , j'ai assemblé cet exemple :
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) } } }
Quels résultats :
key a value ay key b value bee key c value see
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!