登录
首页 >  Golang >  Go问答

分析 YAML 并输出行号

来源:stackoverflow

时间:2024-03-21 23:57:34 191浏览 收藏

在 Go 中分析 YAML 文件并输出行号时,可以通过实现自定义 Unmarshaler 来手动设置行号。具体方法是创建一个自定义结构,并实现 UnmarshalYAML 方法,在该方法中将 YAML 节点的行号保存到结构中。

问题内容

我正在根据 go 中的 yaml 输入创建一个文档生成器。它需要指定每个项目/节点是从 yaml 文件的哪一行生成的。 go 有办法实现吗?

例如,这是一个 yaml 文件

- key1: item 1
  key2: item 2
- key1: another item 1
  key2: another item 2

我想看到以下内容

[
     {'__line__': 1, 'key1': 'item 1', 'key2': 'item 2'},
     {'__line__': 3, 'key1': 'another item 1', 'key2': 'another item 2'},
]

我看到 python parsing yaml, return with line number 回答了类似的问题,但我缺少如何使用 https://pkg.go.dev/gopkg.in/yaml.v3


解决方案


在 go 中,可以通过实现自定义 Unmarshaler 并手动设置行号来实现这一点。

那么让我们构建文件所需的数据结构:

type listitem struct {
    line int

    listitemdata
}

type listitemdata struct {
    key1 string `yaml:"key1"`
    key2 string `yaml:"key2"`
}

现在我们通过在 listitem 类型上创建一个方法来实现 unmarshaler 接口:

func (li *ListItem) UnmarshalYAML(value *yaml.Node) error {
    err := value.Decode(&li.ListItemData)
    if err != nil {
        return err
    }
     
    // Save the line number
    li.Line = value.Line

    return nil
}

您会注意到我创建了一个内部结构,并且仅将数据解码为该结构。这是因为,如果我们对 li 本身调用 decode,则会出现堆栈溢出,因为解码会重复调用 unmarshalyaml 方法。

您可以尝试这个 online 并查看行号是否设置正确。

今天关于《分析 YAML 并输出行号》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>