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 关注
- 101 浏览
添加回答
举报