我試圖使用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完整的堆棧跟蹤在這里。我是否朝著正確的方向前進?如果是這樣,出了什么問題?
1 回答

qq_遁去的一_1
TA貢獻1725條經驗 獲得超8個贊
事實證明,原始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直接使用包。
- 1 回答
- 0 關注
- 140 瀏覽
添加回答
舉報
0/150
提交
取消