Последовательность конфигурации viper yaml
Я пытаюсь прочитать конфигурационный файл yaml, используя viper ( см. Документацию viper). Но я не вижу способа прочитать последовательность значений карты в типах вопросов. Я пробовал различные методы Get_, но ни один из них не поддерживает это.
remote:
host: http://localhost/
user: admin
password: changeit
mapping:
source-project-key: IT
remote-project-key: SCRUM
issue-types:
- source-type: Incident
remote-type: Task
- source-type: Service Request
remote-type: Task
- source-type: Change
remote-type: Story
- source-type: Problem
remote-type: Task
Я хотел бы иметь возможность перебирать последовательность карт [строки]
1 ответ
Если вы внимательно посмотрите на разные Get
методы доступны, вы увидите, что возвращаемые типы string
, []string
, map[string]interface{}
, map[string]string
а также map[string][]string
,
Однако тип значения, связанного с "типами выпусков", []map[string]string
, Таким образом, единственный способ получить эти данные через Get
метод и использование утверждений типа.
Теперь следующий код создает соответствующий тип issue_types
, который []map[string]string
,
issues_types := make([]map[string]string, 0)
var m map[string]string
issues_i := viper.Get("issue-types")
// issues_i is interface{}
issues_s := issues_i.([]interface{})
// issues_s is []interface{}
for _, issue := range issues_s {
// issue is an interface{}
issue_map := issue.(map[interface{}]interface{})
// issue_map is a map[interface{}]interface{}
m = make(map[string]string)
for k, v := range issue_map {
m[k.(string)] = v.(string)
}
issues_types = append(issues_types, m)
}
fmt.Println(reflect.TypeOf(issues_types))
# []map[string]string
fmt.Println(issues_types)
# [map[source-type:Incident remote-type:Task]
# map[source-type:Service Request remote-type:Task]
# map[source-type:Change remote-type:Story]
# map[source-type:Problem remote-type:Task]]
Обратите внимание, что я не делал никаких проверок безопасности, чтобы сделать код меньше. Тем не менее, правильный способ сделать утверждение типа:
var i interface{} = "42"
str, ok := i.(string)
if !ok {
// A problem occurred, do something
}