0

我有以下 yml 文件:

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

我想用 viper 来解析它,但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,但是如果我不知道字段的名称(或者换句话说,如果它是动态的)我该怎么办?

4

1 回答 1

3

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

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

但是从您的问题中不清楚您的 YAML 数据是否真的是任意的,或者items键是否包含统一的项目数组——我的意思是,每个项目都由sourcedestination值组成,只是项目本身的键是未知的。

在后一种情况下,解组该items片段的目标应该是一张地图——类似于

type Item struct {
  Source string
  Destination string
}

items := make(map[string]Item)

err := viper.Unmarshal(items)
于 2018-09-08T16:41:40.883 回答