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

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

Unmarshal YAML 文件 - 如何將前導零作為字符串讀取 YAML 參數?

Unmarshal YAML 文件 - 如何將前導零作為字符串讀取 YAML 參數?

Go
守候你守候我 2022-08-15 16:35:46
如何在沒有任何轉換的情況下將前導零作為字符串讀取YAML屬性?YAML 示例文件:provisioning:  devices:     000000001515:        properties:           example: 30s        options:          dummy: trueGolang Code - 最小可重現性示例:package mainimport (    "fmt"    "github.com/ghodss/yaml")//DeviceSpec devicetype DeviceSpec struct {    Properties map[string]string `yaml:"properties,omitempty"`    Options    map[string]string `yaml:"options,omitempty"`}//Spec provisitype Spec struct {    Provisioning struct {        Devices map[string]DeviceSpec `yaml:"devices,omitempty"`    }}var input = []byte(`provisioning:  devices:     000000001515:        properties:           example: 30s        options:          dummy: true`)func main() {   config := Spec{}   if err := yaml.Unmarshal(input, &config); err != nil {        panic(err)   }   for uuid, _ := range config.Provisioning.Devices {      fmt.Println(uuid)   }}輸出845預期輸出000000001515溶液問題與我使用的 YAML 包有關。用軟件包替換它解決了問題,它工作得很好 - 請參閱下面的評論部分 - 謝謝大家。"github.com/ghodss/yaml" v1.0.0"gopkg.in/yaml.v3"import (    "fmt"    "gopkg.in/yaml.v3")
查看完整描述

1 回答

?
天涯盡頭無女友

TA貢獻1831條經驗 獲得超9個贊

現在我們發現了錯誤,讓我們對發生的事情進行事后分析:

你使用的庫,github.com/ghodss/yaml,說

這個庫首先使用go-yaml將YAML轉換為JSON,然后使用json。元帥和json。取消元帥以轉換為結構或從結構轉換。

關于為什么這是一個好主意的鏈接博客文章消失了,這并沒有特別有幫助。無論如何,讓我們看看那里的代碼實際上做了什么

var yamlObj interface{}
err := yamlUnmarshal(y, &yamlObj)

因此,它采用您的 YAML 輸入并將其加載到接口中。當您實際提供目標類型時,這是一個主意。這里發生的事情是,go-yaml可以自由選擇目標類型,如果是這樣,它顯然以數字形式讀取,前導零作為八進制數。這符合過時的定義??!YAML 1.1 的 int 標記

[-+]?0[0-7_]+ # (base 8)

但是,它早已被YAML 1.2所取代

 0o [0-7]+   tag:yaml.org,2002:int (Base 8)

go-yaml似乎實現了YAML 1.1規則。這似乎是一個糟糕的決定,可能是偶然完成的,可能需要一個問題報告。

因此,無論如何,當加載 YAML 時,該值將被解釋為八進制值。github.com/ghodss/yaml 繼續將值分解為JSON,然后再次將其取消元帥,但我們已經輸了。

結論是,我認為 github.com/ghodss/yaml 有害的,并建議不要使用它。


查看完整回答
反對 回復 2022-08-15
  • 1 回答
  • 0 關注
  • 143 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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