2016-11-18 121 views
0

假設我們有以下Go代碼goyaml字符串轉換爲整型常量

type SectionType int 

const (
    Header SectionType = iota 
    Footer 
    Body 
) 

var sectionTypeNames = map[string]SectionType{ 
    "header": Header 
    "footer": Footer 
    "body": Body 
} 

type Page struct { 
    Sections: []SectionType `yaml:"sections"` 
} 

,我們有以下YAML

page1: 
    - header 
    - body 

有沒有辦法讓goyaml到「頭的字符串轉換「和」body「轉換爲它們各自的int常量類型(如sectionTypeNames圖中定義),我們將Page結構進行反序列化?

回答

2

go-yaml無法自動執行此操作,因爲它只能看到package reflect公開的類型,並且不包含程序包中常量的名稱。根本沒有一個包裝從reflect的角度來看。

這聽起來像你願意自己做(你已經做了map等)。所以我認爲可以做的是做SectionType*[]SectionType*[]SectionTypeUnmarshaler,通過提供一個函數,轉換字符串的YAML包解碼爲值;我缺乏具體的經驗go-yaml能夠告訴你如何實現它,但總的來說,這就是Unmarshaler這樣的接口。

如果這是你經常碰到的東西,那麼寫一些符合stringer的東西來爲你生成映射和反序列化函數(通過檢查定義類型的源文件)可能是值得的。儘管如此,在這之前還是有很多類型的。