2014-11-25 10 views
5

Sto lavorando al mio primo vero progetto Go e ho cercato alcuni strumenti per gestire la configurazione.Configurazione avanzata con il golang Viper lib

Infine, ho trovato questo strumento: https://github.com/spf13/viper che è veramente bello, ma ho alcuni problemi quando si tenta di gestire alcune configurazioni più complesse, come il seguente esempio config.yaml:

app: 
    name: "project-name" 
    version 1 

models: 
    modelA: 
    varA: "foo" 
    varB: "bar" 

    modelB: 
    varA: "baz" 
    varB: "qux" 
    varC: "norf" 

I don so come ottenere i valori dal modello B per esempio. Guardando il codice di lib, ho trovato i seguenti, ma non capisco come usarlo:

// Marshals the config into a Struct 
func Marshal(rawVal interface{}) error {...} 

func AllSettings() map[string]interface{} {...} 

Quello che voglio è essere in grado, da ogni parte nel mio pacchetto, per fare qualcosa di simile :

modelsConf := viper.Get("models") 
fmt.Println(modelsConf["modelA"]["varA"]) 

Qualcuno potrebbe spiegarmi il modo migliore per raggiungere questo obiettivo?

+1

Tutto dipende se i dati sono coerenti. Se tutti i modelli contengono solo varA e varB, perché dovresti creare una nuova entità chiamata modelA (e modelB)? Ma se modelB contiene varA, varB e varC, allora devi fare qualcosa di completamente diverso. – Dippo

+0

Infatti, modelB dovrebbe anche essere in grado di contenere un varC, ho aggiornato l'esempio nella mia domanda iniziale –

+1

Dai un'occhiata a questo [collegamento] (http://golang.org/pkg/encoding/json/#example_RawMessage) – Dippo

risposta

7

Dal momento che il blocco "modelli" è una mappa, è un po 'più facile chiamare

m := viper.GetStringMap("models") 

m sarà una mappa [stringa] interfaccia {}

Poi, si ottiene il valore di m [tasto], che è un'interfaccia {}, quindi la lanci per mappare [interfaccia {}] interfaccia {}:

m := v.GetStringMap("models") 
mm := m["modelA"].(map[interface{}]interface{}) 

Ora è possibile accedere tasto "vara" passando la chiave come interfaccia {}:

mmm := mm[string("varA")] 

mmm è foo

0

Si può semplicemente utilizzare:

m := viper.Get("models.modelA")

o

newViperForModelA := viper.Sub("models").Sub("modelA")