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.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) } }
从 来自 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 %s\n", k_str, v_str) } } }
哪些输出:
key a value ay key b value bee key c value see
以上是无法从通过 YAML 获取的映射中提取键/值对的详细内容。更多信息请关注PHP中文网其他相关文章!