2017-01-13 6 views
1

Im новым идти, и им с помощью гадюки загружает все мои конфигурации, что в настоящее время у меня есть это YAML выглядеть, как показано нижеMapping вложенной конфигурация 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 

отметить, что CountryCode динамичны это может быть добавлено в любое время для любых стран. Так как же я карта это на структуру, где с технической точки зрения я могу сделать

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

я стараюсь contruct это сам, обернув его, но им stucked здесь

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 
} 

Любая помощь будет оценена

ответ

0

Вот некоторые простой код с go-yaml:

package main 

import (
    "fmt" 
    "gopkg.in/yaml.v2" 
    "log" 
) 

var data = ` 
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 
` 

func main() { 
    m := make(map[interface{}]interface{}) 

    err := yaml.Unmarshal([]byte(data), &m) 
    if err != nil { 
     log.Fatalf("error: %v", err) 
    } 

    fmt.Printf("%v\n", m) 
} 
1

Если вы хотите, чтобы сопоставить yaml структуру строгой golang struct вы могли бы использовать в mapstructure библиотеки для отображения вложенных пар ключ/значение, при каждая страна.

Например:

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) 
    } 
} 
+1

После сделано somemore чтения понял что у Viper есть своя собственная немаршалинга, которая работает как шарм, поэтому я решил использовать это, –

1

После сделал некоторые чтения понял, что гадюка имеет его собственные возможности демаршалинга, который прекрасно работает https://github.com/spf13/viper#unmarshaling

Так вот, что я сделал

type Configuration struct { 
    Countries map[string][]CountryQuery `mapstructure:"countryQueries"` 
} 

type CountryQuery struct { 
    QType  string 
    QPlaceType string 
} 

func BuildConfig() { 
    viper.SetConfigName("configFileName") 
    viper.AddConfigPath("./config") 
    err := viper.ReadInConfig() 
    if err != nil { 
     panic(fmt.Errorf("Error config file: %s \n", err)) 
    } 

    var config Configuration 

    err = viper.Unmarshal(&config) 
    if err != nil { 
     panic(fmt.Errorf("Unable to decode Config: %s \n", err)) 
    } 
}