Golang гибких типов в ямле - PullRequest
0 голосов
/ 24 мая 2019

Я пытаюсь проанализировать файл 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?

Примечание: в моем случае все структуры для каждого типа известны, мне не нужно обрабатывать пользовательские динамические структуры

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...