如何从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
相关产品推荐
相关产品推荐

