首页 文章

具有未知属性的接口

提问于
浏览
3

我正在尝试使用frontmatter包中的Unmarshal method来解析markdown文件中的前端问题 .

该功能的类型签名如下

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"`
    }
}

然后创建struct t 的实例并将指针传递给 tUnmarshal .

t := T{}

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

据我了解,如果YAML看起来像这样,这只会起作用:

a: Easy!
b:
  c: 2
  d: [3, 4]

第二个例子看起来更接近我需要的东西 . 它似乎使用了 interface{} -> interface{} 的 Map ,而不是创建一个结构 .

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

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

我对Go和我来说相对较新,这看起来像一张通用 Map ,非常适合阅读未知值 .

我已经为我自己的项目调整了示例,最后得到了以下代码 .

m := make(map[interface{}]interface{})
err := frontmatter.Unmarshal(data, &m)

但这会导致运行时错误

恐慌:反映:非结构类型的NumField

完整的堆栈跟踪here .


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

1 回答

  • 0

    事实证明,原始的 yaml.Unmarshal 方法非常强大,只有在接收到前面的内容时,即使提供整个文件也是如此 .

    我最终使用的解决方案看起来像这样 .

    // read file made up of front matter and content
    data, err := ioutil.ReadFile(file)
    
    if err != nil {
      log.Fatal(err)
    }
    
    meta := make(map[interface{}]interface{})
    yaml.Unmarshal([]byte(data), &meta)
    

    这意味着删除 frontmatter 包并直接使用 yaml 包 .

相关问题