为了账号安全,请及时绑定邮箱和手机立即绑定

viper yaml 配置序列

viper yaml 配置序列

Go
萧十郎 2022-01-10 19:07:56
我正在尝试使用 viper 读取 yaml 配置文件(请参阅 viper 文档)。但是我看不到在问题类型下读取地图值序列的方法。我尝试了各种 Get_ 方法,但似乎没有一个支持这一点。remote:  host: http://localhost/  user: admin  password:  changeitmapping:    source-project-key: IT    remote-project-key: SCRUMissue-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] 的序列
查看完整描述

1 回答

?
潇潇雨雨

TA贡献1833条经验 获得超4个赞

如果您在不同的仔细观察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

}


查看完整回答
反对 回复 2022-01-10
  • 1 回答
  • 0 关注
  • 150 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信