gpt4 book ai didi

go - 如何从 Viper 访问数组中的特定项目

转载 作者:行者123 更新时间:2023-12-01 22:20:26 24 4
gpt4 key购买 nike

我有一个类似于以下的 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 方法时如何区分“第一个复杂项”和“第二个复杂项”。我是否需要在复杂项目到达时保持它们的开始状态?

最佳答案

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

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

config.ComplexItemList[0].StructItemList[0].Data2 = "updated item"
viper.Set("ComplexItemList", config.ComplexItemList)
或者这不是通过 viper 处理更新 yaml 文件中的数组的正确方法吗?

关于go - 如何从 Viper 访问数组中的特定项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63889004/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com