1 回答

TA貢獻(xiàn)1831條經(jīng)驗(yàn) 獲得超9個(gè)贊
現(xiàn)在我們發(fā)現(xiàn)了錯(cuò)誤,讓我們對(duì)發(fā)生的事情進(jìn)行事后分析:
你使用的庫,github.com/ghodss/yaml,說
這個(gè)庫首先使用go-yaml將YAML轉(zhuǎn)換為JSON,然后使用json。元帥和json。取消元帥以轉(zhuǎn)換為結(jié)構(gòu)或從結(jié)構(gòu)轉(zhuǎn)換。
關(guān)于為什么這是一個(gè)好主意的鏈接博客文章消失了,這并沒有特別有幫助。無論如何,讓我們看看那里的代碼實(shí)際上做了什么:
var yamlObj interface{} err := yamlUnmarshal(y, &yamlObj)
因此,它采用您的 YAML 輸入并將其加載到接口中。當(dāng)您實(shí)際提供目標(biāo)類型時(shí),這是一個(gè)壞主意。這里發(fā)生的事情是,go-yaml可以自由選擇目標(biāo)類型,如果是這樣,它顯然以數(shù)字形式讀取,前導(dǎo)零作為八進(jìn)制數(shù)。這符合過時(shí)的定義??!YAML 1.1 的 int 標(biāo)記:
[-+]?0[0-7_]+ # (base 8)
但是,它早已被YAML 1.2所取代:
0o [0-7]+ tag:yaml.org,2002:int (Base 8)
go-yaml似乎實(shí)現(xiàn)了YAML 1.1規(guī)則。這似乎是一個(gè)糟糕的決定,可能是偶然完成的,可能需要一個(gè)問題報(bào)告。
因此,無論如何,當(dāng)加載 YAML 時(shí),該值將被解釋為八進(jìn)制值。github.com/ghodss/yaml 繼續(xù)將值分解為JSON,然后再次將其取消元帥,但我們已經(jīng)輸了。
結(jié)論是,我認(rèn)為 github.com/ghodss/yaml 有害的,并建議不要使用它。
- 1 回答
- 0 關(guān)注
- 139 瀏覽
添加回答
舉報(bào)