You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从goldmark-meta解析的YAML列表Map中提取键值对?

问题:如何从goldmark-meta返回的单个键值对Map列表中提取键和值?

我使用goldmark-meta包读取YAML文件,目标YAML内容如下:

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

读取后得到的是包含单个键值对的Map列表,目前仅能遍历得到这些Map,但在未知键名的情况下不知道如何提取键与值的字符串。当前代码及输出如下:

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]

解决方案

goldmark-meta解析YAML后,列表中的每个元素实际是map[interface{}]interface{}类型,你可以通过类型断言将其转换为该类型,再遍历这个map的键值对(每个map仅包含一组键值),最后将键和值断言为字符串即可:

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 _, item := range b {
        // 将列表元素断言为map类型
        itemMap, ok := item.(map[interface{}]interface{})
        if !ok {
            continue // 非预期类型,跳过处理
        }
        // 遍历map的键值对(每个map只有一组)
        for key, val := range itemMap {
            // 将键和值转换为字符串类型
            keyStr, isKeyStr := key.(string)
            valStr, isValStr := val.(string)
            if isKeyStr && isValStr {
                debug("Key: %s, Value: %s", keyStr, valStr)
                // 这里可根据需求处理提取出的键值字符串
            }
        }
    }
    return ""
}

说明

  • goldmark-meta解析YAML时,会将非结构化数据转为interface{}类型,因此需要显式断言为具体类型(这里是string)。
  • 因为每个列表元素仅包含一个键值对,所以遍历map时只会得到一组结果,无需担心多键值的情况。

内容的提问来源于stack exchange,提问作者tomcam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 23:00:40