gpt4 book ai didi

go - 具有未知属性的接口(interface)

转载 作者:IT王子 更新时间:2023-10-29 01:15:26 24 4
gpt4 key购买 nike

我正在尝试使用 Unmarshal method来自 frontmatter从 Markdown 文件中解析前面内容的包。

函数的类型签名如下

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

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

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

type T struct {
A string
B struct {
RenamedC int `yaml:"c"`
D []int `yaml:",flow"`
}
}

然后创建结构体 t 的实例并将指向 t 的指针传递给 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

完整的堆栈跟踪 here .


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

最佳答案

事实证明,原始的 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 包。

关于go - 具有未知属性的接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35363398/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com