用毒蛇解析YAML时如何使用动态密钥?

时间:2018-09-07 22:08:05

标签: parsing go struct yaml viper-go

我有以下yml文件:

# config.yml
items:
  name-of-item: # dynamic field
    source: ...
    destination: ...

我想使用毒蛇来解析它,但是name-of-item可以是任何东西,因此我不确定如何解决。我知道我可以使用以下内容:

// inside config folder
package config

type Items struct {
  NameOfItem NameOfItem
}

type NameOfItem struct {
  Source string
  Destination string
}

// inside main.go
package main

import (
    "github.com/spf13/viper"
    "log"
    "github.com/username/lib/config"
)

func main() {

    viper.SetConfigName("config.yml")
    viper.AddConfigPath(".")

    var configuration config.Item
    if err := viper.ReadInConfig(); err != nil {
        log.Fatalf("Error reading config file, %s", err)
    }

    err := viper.Unmarshal(&configuration)
    if err != nil {
        log.Fatalf("unable to decode into struct, %v", err)
    }
}

在这种情况下,因为我声明了NameOfItem,所以我可以取消编组,但是如果我不知道字段名称(或者,如果它是动态的),该怎么办?

1 个答案:

答案 0 :(得分:1)

Go中的struct类型可能不是动态的(我怀疑它们可能是任何其他严格类型的语言),因此您必须使用两个阶段的过程:

  1. 将相关数据解组为类型map[string]interface{}的值。
  2. 通过迭代地图的键对结果进行后处理 并为与特定键对应的值使用类型断言。

但是您的问题尚不清楚,您的YAML数据是否真的是任意的,或者items键是否包含 uniform 项数组-我的意思是,每个项都由{{1 }}和source值,只是项本身的键未知。

在后一种情况下,解压缩destination件的目标应该是地图-类似于

items