2 回答

TA貢獻1789條經驗 獲得超8個贊
解組到interface{}不會神奇地猜測您想要自定義CharacterConfig結構中的結果。將YAML 解組為interface{}將用于map[interface{}]interface{}表示對象,并[]interface{}以遞歸方式表示列表/數組。
所以上面的類型斷言產生ok = false了,因為存儲在其中的值是interfaces{}. 您可以鍵入 assert 這些類型,并且斷言將成功,但您不會更接近將這些值作為您的結構。
另請注意,您的輸入 YAML 需要另一個包裝層:
type Character struct {
CC CharacterConfig `yaml:"Character"`
}
type CharacterList struct {
CCs []CharacterConfig `yaml:"Character"`
}
所以一個簡單的方法是首先嘗試解組為 type 的值Character,如果成功,你就完成了。如果沒有,請嘗試再次解組,這次進入CharacterList.
這是執行此操作的示例代碼:
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)
}
像這樣測試它:
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貢獻1859條經驗 獲得超6個贊
與您所做的類似,但沒有界面:
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 關注
- 120 瀏覽
添加回答
舉報