我的问题:

如何编写以下代码从嵌套的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")

我的问题:

打印此字时,我得到一个空白字符串。根据文档,这就是您获取嵌套元素的方式。我怀疑它不起作用,因为元素是列表。我需要做一个结构吗?我是新来的,所以不确定如何制作一个,特别是如果需要嵌套的话。

最佳答案

毒蛇库中有不同的Get方法可用,并且您的YML结构的类型为[]map[string]string,因此要解析您的YML配置文件,您必须使用viper.Get方法。因此,您必须像这样解析文件。

注意:您也可以使用struct取消编码(marshal)数据。请参阅这篇文章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
*/

关于go - 如何使用Viper从嵌套的YAML结构中获取值?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52585309/

10-11 01:12