0

viper を使用して yaml 構成ファイルを読み込もうとしています ( viper docs を参照)。しかし、Issue-types の下にある一連のマップ値を読み取る方法がわかりません。さまざまな 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] のシーケンスを繰り返し処理できるようにしたい

4

1 に答える 1

1

利用可能なさまざまなメソッドをよく見ると、戻り値の型が、、、およびであるGetことがわかります。string[]stringmap[string]interface{}map[string]stringmap[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
}
于 2016-05-24T22:56:54.580 に答える