Maison > développement back-end > Golang > Impossible d'extraire les paires clé/valeur de la carte obtenue via YAML

Impossible d'extraire les paires clé/valeur de la carte obtenue via YAML

王林
Libérer: 2024-02-08 23:40:29
avant
389 Les gens l'ont consulté

无法从通过 YAML 获取的映射中提取键/值对

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.

Contenu de la question

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
Copier après la connexion

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 ""
}
Copier après la connexion
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]
Copier après la connexion

Comment obtenir une chaîne de clé et de valeur ?

Solution de contournement

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 {
  ...
}
Copier après la connexion

Pour chaque item, nous pouvons parcourir les clés et valeurs disponibles :

for _, item := range burger {
  for k, v := range item.(map[interface{}]interface{}) {
    ...
  }
}
Copier après la connexion

Nous pouvons utiliser fmt.sprintfinterface{} 中的键和值转换为 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)
  }
}
Copier après la connexion

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)
        }
    }
}
Copier après la connexion

Quels résultats :

key a value ay
key b value bee
key c value see
Copier après la connexion

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!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal