viper yaml 配置序列

我正在尝试使用 viper 读取 yaml 配置文件(请参阅 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

我希望能够遍历 map[strings] 的序列


萧十郎
浏览 151回答 1
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]stringissues_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]stringfmt.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}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go