Я пытаюсь проанализировать файл yaml с массивом объектов, которые могут иметь различную структуру в зависимости от их поля type
.например,
conditions:
- type: branch
value:
str: master
- type: boolean
value: true
Я прочитал десятки вопросов о стековом потоке и различные посты в блоге, но это далеко, как я получил:
package main
import (
"log"
"gopkg.in/yaml.v2"
)
type conditions struct {
Conditions []condition
}
type condition struct {
Type string
Value interface{}
}
type stringCondition struct {
Str string
}
func main() {
c := conditions{}
text := `
conditions:
- type: branch
value:
str: master
- type: boolean
value: true
`
err := yaml.Unmarshal([]byte(text), &c)
if err != nil {
log.Fatal(err)
}
for i, b := range c.Conditions {
value := b.Value
switch b.Type {
case "branch":
log.Printf("%v is a branch condition", i)
if val, ok := value.(stringCondition); ok {
log.Printf("%v value: %v", i, val)
} else if val, ok := value.(map[string]string); ok {
log.Printf("%v value: %v", i, val)
} else {
log.Printf("type assertions failed")
log.Printf("%v value: %v", i, val)
log.Printf("value type: %T", value)
}
case "boolean":
log.Printf("%v a boolean condition", i)
if val, ok := value.(bool); ok {
log.Printf("%v value: %v", i, val)
} else {
log.Printf("type assertions failed")
}
default:
log.Fatalf("unknown type in condition: %v", c.Conditions[0].Type)
}
log.Println("\n")
}
}
Утверждение логического типа работает, ноне тип ветви для condition
struct или map[string][string]
.Как бы я получить стоимость филиала?Как бы я справился с большим и более сложным файлом yaml?
Примечание: в моем случае все структуры для каждого типа известны, мне не нужно обрабатывать пользовательские динамические структуры