【问题标题】:How to access specific items in an array from Viper如何从 Viper 访问数组中的特定项目
【发布时间】:2021-01-01 10:52:08
【问题描述】:

我有一个类似于以下的 yaml 文件:

ComplexItemList:
- Name: First Complex item
  Date: Whenever
  StructItemList:
  - Name: blah
    Data1: 0
    Data2: Silly
  - Name: Yaddah
    Data1: 12
    Data2: Blah-blah-blah
- Name: Second Complex item
  Date: Yesterday
  StructItemList:
  - Name: blah
    Data1: 0
    Data2: Silly
  - Name: Yaddah
    Data1: 12
    Data2: Blah-blah-blah

这是我的代码的简单版本:

package main

import (
    "fmt"

    "github.com/spf13/viper"
)

type StructItem struct {
    Name  string `yaml:"Name"`
    Data1 int    `yaml:"Data1"`
    Data2 string `yaml:"Data2"`
}

type ComplexItem struct {
    Name           string       `yaml:"Name"`
    Date           string       `yaml:"Date"`
    StructItemList []StructItem `yaml:"StructItemList,mapstructure"`
}

type TestConfig struct {
    Version         string        `yaml:"Version"`
    ComplexItemList []ComplexItem `yaml:"ComplexItemList,mapstructure"`
}

func main() {
    viper.SetConfigName("simple1") // name of config file (without extension)
    viper.SetConfigType("yaml")    // REQUIRED if the config file does not have the extension in the name
    viper.AddConfigPath(".")
    err := viper.ReadInConfig() // Find and read the config file
    if err != nil {             // Handle errors reading the config file
        panic(fmt.Errorf("Fatal error config file: %s \n", err))
    }

    test1 := viper.Get("ComplexItemList")
    fmt.Printf("test1:\n%#v\n", test1)
    // while I can easily unmarshal the information into a complex struct,
    // updating the file contents via viper does not seem straight forward.
    // Is there a way to access a specific item in an array using viper dot notation?

    config := TestConfig{}
    viper.Unmarshal(&config)
    // is the best way to update Data1 for "First Complex item", just to update the
    // unmarshalled struct then write the whole thing back out?
}

我想使用 Viper 读取配置文件,但我不确定在使用 Get 方法时如何区分“第一个复杂项”和“第二个复杂项”。我是否需要在复杂项目到达时维护它们的开始状态?

【问题讨论】:

  • 请展示您的尝试。
  • 我真的很想知道如何将内存中配置的更改序列化到磁盘上的文件中,因为 viper 中没有 Marshal 方法。我认为正确的用法是使用“viper.Set("x.y.z", value)",但我不知道在数组的情况下“x.y.z”应该是什么。

标签: go yaml viper-go


【解决方案1】:

我把事情复杂化了。最简单的方法是解组这些值,更新它们,然后从对象中设置数组。

    config := TestConfig{}
    viper.Unmarshal(&config)

    config.ComplexItemList[0].StructItemList[0].Data2 = "updated item"
    viper.Set("ComplexItemList", config.ComplexItemList)

或者这不是通过 viper 处理更新 yaml 文件中的数组的正确方法吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-14
    • 1970-01-01
    相关资源
    最近更新 更多