[英]viper yaml config sequence
I'm trying to read a yaml config file using viper ( see viper docs ). 我正在尝试使用viper读取yaml配置文件( 请参阅viper文档 )。 But I cannot see a way to read the sequence of map values under issue-types.
但是我看不到一种在问题类型下读取映射值序列的方法。 I've tried the various Get_ methods but none seem to support this.
我尝试了各种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
I'd like to be able to iterate over the sequence of map[strings] 我希望能够遍历map [strings]的序列
If you look closely at the different Get
methods available, you'll see that the return types are string
, []string
, map[string]interface{}
, map[string]string
and map[string][]string
. 如果仔细查看可用的不同
Get
方法,您会发现返回类型为string
, []string
, map[string]interface{}
, map[string]string
和map[string][]string
。
However, the type of the value associated with "issue-types" is []map[string]string
. 但是,与“ issue-types”关联的值的类型为
[]map[string]string
。 So, the only way to get this data is through the Get
method and using type assertions. 因此,获取此数据的唯一方法是通过
Get
方法并使用类型断言。
Now, the following code produces the appropriate type of issue_types
, which is []map[string]string
. 现在,以下代码生成适当的
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]]
Note that I did not do any safety check in order to make the code smaller. 请注意,为了使代码更小,我没有进行任何安全检查。 However, the correct way of doing type assertion is:
但是,执行类型声明的正确方法是:
var i interface{} = "42"
str, ok := i.(string)
if !ok {
// A problem occurred, do something
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.