具有未知属性的接口

我试图使用Unmarshal方法从frontmatter包从降价文件解析前的事。


函数的类型签名如下


func Unmarshal(data []byte, v interface{}) (err error)

我有字节数据,我知道我需要传递一个带有适当字段的接口/结构作为第二个参数——但是我不知道我解析的文件中的字段是什么,这很重要我不会丢失数据。


这个包在内部使用yaml.v2,它提供了一个更全面的例子,用于在解组之前定义接口。


type T struct {

    A string

    B struct {

        RenamedC int   `yaml:"c"`

        D        []int `yaml:",flow"`

    }

}

然后创建该结构体的一个实例t并将一个指针传递给tthrough to Unmarshal。


t := T{}


err := yaml.Unmarshal([]byte(data), &t)

据我了解,只有当 YAML 看起来像这样时,这才会起作用:


a: Easy!

b:

  c: 2

  d: [3, 4]

第二个例子看起来更接近我需要的。它似乎没有创建结构,而是使用interface{} -> interface{}.


m := make(map[interface{}]interface{})


err = yaml.Unmarshal([]byte(data), &m)

我对 Go 比较陌生,对我来说这看起来像一张通用地图,非常适合阅读未知值。


我已经为我自己的项目改编了这个例子,最后得到了以下代码。


m := make(map[interface{}]interface{})

err := frontmatter.Unmarshal(data, &m)

但这会导致运行时错误


panic: reflect: NumField of non-struct type

完整的堆栈跟踪在这里。


我是否朝着正确的方向前进?如果是这样,出了什么问题?


千万里不及你
浏览 159回答 1
1回答

qq_遁去的一_1

事实证明,原始yaml.Unmarshal方法足够健壮,即使在呈现整个文件时也只能提取最前面的内容。我最终使用的解决方案如下所示。// read file made up of front matter and contentdata, err := ioutil.ReadFile(file)if err != nil {  log.Fatal(err)}meta := make(map[interface{}]interface{})yaml.Unmarshal([]byte(data), &meta)这意味着删除frontmatter包并yaml直接使用包。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go