亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

具有未知屬性的接口

具有未知屬性的接口

Go
千萬里不及你 2021-12-13 16:38:23
我試圖使用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直接使用包。


查看完整回答
反對 回復 2021-12-13
  • 1 回答
  • 0 關注
  • 140 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號