2 回答

TA貢獻(xiàn)1789條經(jīng)驗(yàn) 獲得超8個(gè)贊
解組到interface{}不會(huì)神奇地猜測(cè)您想要自定義CharacterConfig結(jié)構(gòu)中的結(jié)果。將YAML 解組為interface{}將用于map[interface{}]interface{}表示對(duì)象,并[]interface{}以遞歸方式表示列表/數(shù)組。
所以上面的類型斷言產(chǎn)生ok = false了,因?yàn)榇鎯?chǔ)在其中的值是interfaces{}. 您可以鍵入 assert 這些類型,并且斷言將成功,但您不會(huì)更接近將這些值作為您的結(jié)構(gòu)。
另請(qǐng)注意,您的輸入 YAML 需要另一個(gè)包裝層:
type Character struct {
CC CharacterConfig `yaml:"Character"`
}
type CharacterList struct {
CCs []CharacterConfig `yaml:"Character"`
}
所以一個(gè)簡(jiǎn)單的方法是首先嘗試解組為 type 的值Character,如果成功,你就完成了。如果沒有,請(qǐng)嘗試再次解組,這次進(jìn)入CharacterList.
這是執(zhí)行此操作的示例代碼:
func unmarshal(data []byte) {
var c Character
err := yaml.Unmarshal(data, &c)
if err == nil {
fmt.Printf("It's Character: %+v\n", c)
return
}
var cl CharacterList
err = yaml.Unmarshal(data, &cl)
if err != nil {
panic(err)
}
fmt.Printf("It's CharacterList: %+v\n", cl)
}
像這樣測(cè)試它:
func main() {
unmarshal([]byte(src))
unmarshal([]byte(src2))
}
const src = `Character:
Name: Stackoverflow
Type: Awesome`
const src2 = `Character:
- Name: Stackoverflow
Type: Awesome
Friends: [Ben, John]
- Name: Facebook
Type: Ok`
輸出將是(在Go Playground上嘗試):
It's Character: {CC:{Name:Stackoverflow Type:Awesome Friends:[]}}
It's CharacterList: {CCs:[{Name:Stackoverflow Type:Awesome Friends:[Ben John]} {Name:Facebook Type:Ok Friends:[]}]}

TA貢獻(xiàn)1859條經(jīng)驗(yàn) 獲得超6個(gè)贊
與您所做的類似,但沒有界面:
type CharacterConfig struct{
Name string `yaml:"Name"`
Type string `yaml:"Type"`
Friends []string `yaml:"Friends,omitempty"`
}
var a CharacterConfig
var b []CharacterConfig
err := yaml.Unmarshal([]byte(yamlData), &a)
if err == nil {
// a is valid format
}
err = yaml.Unmarshal([]byte(yamlData), &b)
if err == nil {
// b is valid format
}
- 2 回答
- 0 關(guān)注
- 128 瀏覽
添加回答
舉報(bào)