利用可能なさまざまなメソッドをよく見ると、戻り値の型が、、、およびであるGet
ことがわかります。string
[]string
map[string]interface{}
map[string]string
map[string][]string
ただし、「issue-types」に関連付けられている値のタイプは です[]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
}