卓越飞翔博客卓越飞翔博客

卓越飞翔 - 您值得收藏的技术分享站
技术文章34464本站已运行393

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

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

php小编小新在使用YAML获取映射时,时常会遇到一个问题,即无法从通过YAML获取的映射中提取键/值对。这个问题在实际开发中是非常常见的,它可能会导致无法正确读取配置文件或者无法获取到正确的数据。在本文中,我们将深入探讨这个问题的原因,并提供一些解决方案,帮助开发者在使用YAML时更加顺利地提取键/值对。

问题内容

我使用 goldmark-meta 包来读取 yaml 文件。 我感兴趣的内容是这样的 在 yaml 中:

burger:
- a: ay
- b: bee
- c: see

我想访问键和值 返回的界面,我被卡住了。 迭代返回给了我一个 键/值对的列表,但我没有 当我不知道时知道如何获取任何信息 提前知道按键名称。 该程序打印出以下内容:

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]

如何获取键和值字符串?

解决方法

在您的 yaml 数据中,您有一个键 (burger),其值是映射列表(每个映射都有一个键)。我们可以像这样迭代 burger 中的项目:

b, ok := c.pagefm["burger"].([]interface{})
if !ok {
  return ""
}

for _, item := range burger {
  ...
}

对于每个 item,我们可以迭代可用的键和值:

for _, item := range burger {
  for k, v := range item.(map[interface{}]interface{}) {
    ...
  }
}

我们可以使用 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 %sn", k_str, v_str)
  }
}

从 来自 goldmark-meta 的示例代码开始,我把这个例子放在一起:

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 %sn", k_str, v_str)
        }
    }
}

哪些输出:

key a value ay
key b value bee
key c value see
卓越飞翔博客
上一篇: 如何在golang中根据ID取消通道作业
下一篇: 返回列表
留言与评论(共有 0 条评论)
   
验证码:
隐藏边栏