如何在沒有任何轉換的情況下將前導零作為字符串讀取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 有害的,并建議不要使用它。
- 1 回答
- 0 關注
- 143 瀏覽
添加回答
舉報
0/150
提交
取消