具有未知属性的接口

时间:2016-02-12 13:05:51

标签: go

我尝试使用Unmarshal method包中的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的实例,并将指针传递给tUnmarshal

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

完整的堆栈跟踪here

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

1 个答案:

答案 0 :(得分:0)

事实证明,原始BoxCollider2D方法非常强大,即使只有整个文件出现,也只能获取前面的内容。

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

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包。