Как мне использовать Viper, чтобы получить значение из вложенной структуры YAML? - PullRequest
0 голосов
/ 01 октября 2018

Мой вопрос:

Как мне написать приведенный ниже код для получения строки из моей вложенной структуры yaml?

Вот мой yaml:

    element:
      - one:
          url: http://test
          nested: 123
      - two:
          url: http://test
          nested: 123

    weather:
      - test:
          zipcode: 12345
      - ca:
          zipcode: 90210

ЗдесьПример кода

    viper.SetConfigName("main_config")
      viper.AddConfigPath(".")
      err := viper.ReadInConfig()
      if err != nil {
        panic(err)
      }
    testvar := viper.GetString("element.one.url")

Моя проблема:

При печати я получаю пустую строку.Согласно документам, именно так вы получаете вложенный элемент.Я подозреваю, что это не работает, потому что элементы являются списками.Мне нужно сделать структуру?Я новичок, поэтому не знаю, как его создать, особенно если он должен быть вложенным.

1 Ответ

0 голосов
/ 01 октября 2018

Существуют различные методы Get, доступные в библиотеке viper, и ваша структура YML имеет тип []map[string]string, поэтому для разбора файла конфигурации YML необходимо использовать метод viper.Get.Поэтому вам нужно проанализировать ваш файл примерно так:

Примечание: Вы также можете использовать struct для разархивирования данных.Пожалуйста, обратитесь к этому сообщению mapping-nested-config-yaml-to-struct

package main

import (
    "fmt"

    "github.com/spf13/viper"
)

func main() {
    viper.SetConfigName("config")
    viper.AddConfigPath(".")
    err := viper.ReadInConfig()
    if err != nil {
        panic(err)
    }
    testvar := viper.Get("element")
    fmt.Println(testvar)
    elementsMap := testvar.([]interface{})
    for k, vmap := range elementsMap {
        fmt.Print("Key: ", k) 
        fmt.Println(" Value: ", vmap)
        eachElementsMap := vmap.(map[interface{}]interface{})

        for k, vEachValMap := range eachElementsMap {
            fmt.Printf("%v: %v \n", k, vEachValMap)
            vEachValDataMap := vEachValMap.(map[interface{}]interface{})

            for k, v := range vEachValDataMap {
                fmt.Printf("%v: %v \n", k, v)
            }
        }
    }
}

// Output:
/*
Key: 0 Value:  map[one:map[url:http://test nested:123]]
one: map[url:http://test nested:123]
url: http://test
nested: 123
Key: 1 Value:  map[two:map[url:http://test nested:123]]
two: map[url:http://test nested:123]
url: http://test
nested: 123
*/
...