2014-11-25 11 views
5

Pracuję nad moim pierwszym prawdziwym projektem Go i szukałem narzędzi do obsługi konfiguracji.Zaawansowana konfiguracja z golang Viper lib

Wreszcie znalazłem tego narzędzia: https://github.com/spf13/viper, który jest naprawdę ładne, ale mam pewne problemy, gdy próbuję obsłużyć kilka bardziej złożonych konfiguracjach, takich jak następującej config.yaml przykład:

app: 
    name: "project-name" 
    version 1 

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

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

I don wiesz, jak uzyskać wartości z modelu B na przykład. Patrząc na kod lib, Znalazłem co nastepuje, ale ja naprawdę nie rozumiem, jak go używać:

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

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

Co chcę jest w stanie, z całym moim pakiecie, aby zrobić coś podobnego :

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

Czy ktoś mógłby mi wytłumaczyć najlepszy sposób, aby to osiągnąć?

+1

Wszystko zależy od tego, czy dane są spójne. Jeśli wszystkie modele zawierają tylko varA i varB, dlaczego stworzysz nowy obiekt o nazwie modelA (i modelB)? Ale jeśli model B zawiera warA, varB i varC, musisz zrobić coś zupełnie innego. – Dippo

+0

W rzeczywistości model B powinien również być w stanie zawrzeć zmienną C, zaktualizowałem przykład w moim początkowym pytaniu –

+1

Zobacz [link] (http://golang.org/pkg/encoding/json/#example_RawMessage) – Dippo

Odpowiedz

7

Od „modele” bloku znajduje się mapa, to trochę łatwiej zadzwonić

m := viper.GetStringMap("models") 

m będzie mapie [łańcuch] interfejs {}

Następnie należy uzyskać wartość m [key], który jest interfejsem {}, więc oddasz go do map [interfejs {}] interfejs {}:

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

teraz można uzyskać dostęp do klucza "Vara" przekazując klucz jako interfejs {}:

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

mmm jest foo

0

można po prostu użyć:

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

lub

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