2

私は初心者で、viper を使用してすべての構成をロードします。現在私が持っているのは、以下のような YAML です。

 countryQueries:
  sg:
    - qtype: gmap
      qplacetype: postal_code
    - qtype: gmap
      qplacetype: address
    - qtype: geocode
      qplacetype: street_address

  hk:
    - qtype: gmap
      qplacetype: postal_code
    - qtype: gmap
      qplacetype: address
    - qtype: geocode
      qplacetype: street_address

国コードは動的であり、どの国でもいつでも追加できることに注意してください。では、これを技術的に言えばできる構造体にマップするにはどうすればよいですか

for _, query := range countryQueries["sg"] { }

ループして自分で構築しようとしましたが、ここで立ち往生しています

for country, queries := range viper.GetStringMap("countryQueries") {
    // i cant seem to do anything with queries, which i wish to loop it
    for _,query := range queries {} //here error
}
4

4 に答える 4

1

yaml構造を厳密な golangにマップする場合は、 mapstructurestructライブラリを使用して、ネストされたキーと値のペアを各国にマップできます。

例えば:

package main

import (
    "github.com/spf13/viper"
    "github.com/mitchellh/mapstructure"
    "fmt"
    "log"
)

type CountryConfig struct {
    Qtype string
    Qplacetype string
}
type QueryConfig struct {
    CountryQueries map[string][]CountryConfig;
}
func NewQueryConfig () QueryConfig {
    queryConfig := QueryConfig{}
    queryConfig.CountryQueries = map[string][]CountryConfig{}
    return queryConfig
}
func main() {

    viper.SetConfigName("test")
    viper.AddConfigPath(".")
    err := viper.ReadInConfig()
    queryConfig := NewQueryConfig()
    if err != nil {
        log.Panic("error:", err)
    } else {
        mapstructure.Decode(viper.AllSettings(), &queryConfig)
    }
    for _, config := range queryConfig.CountryQueries["sg"] {

        fmt.Println("qtype:", config.Qtype, "qplacetype:", config.Qplacetype)
    }
}
于 2017-01-15T01:20:30.427 に答える