登录
首页 >  Golang >  Go问答

如何在 viper 中处理 YAML 中的动态键?

来源:stackoverflow

时间:2024-03-05 09:36:27 189浏览 收藏

Golang小白一枚,正在不断学习积累知识,现将学习到的知识记录一下,也是将我的所得分享给大家!而今天这篇文章《如何在 viper 中处理 YAML 中的动态键?》带大家来了解一下##content_title##,希望对大家的知识积累有所帮助,从而弥补自己的不足,助力实战开发!


问题内容

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


解决方案


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

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

但是从你的问题中并不清楚你的 yaml 数据是否真的是任意的,或者 items 键包含一个统一的项目数组 - 我的意思是,每个项目都包含 sourcedestination 值,只是项目本身的密钥未知。

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

type Item struct {
  Source string
  Destination string
}

items := make(map[string]Item)

err := viper.Unmarshal(items)

今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>