【发布时间】:2019-04-11 15:11:13
【问题描述】:
我正在读取一个 yaml 文件,并将其解组为 map[interface{}]interface{}。目标是替换 yaml 中的某个值,并使用替换的值更新读入的文件。我不确定如何解析地图以获取我想要更改的特定键 (password)。我相信你可以使用reflect,但我不能 100% 确定语法
我正在阅读的 YAML 文件 (config.yml):
i_name: example
instances:
- name: test-instance
command: get
arguments:
hostname: localhost
port: 203
username: test
password: testing123
labels:
env: dev
到目前为止的代码:
func replaceConfigPassword() {
yamlFile, err := ioutil.ReadFile("config.yml")
fatalIfErr(err)
m := make(map[interface{}]interface{})
err = yaml.Unmarshal(yamlFile, &m)
fatalIfErr(err)
fmt.Println(m)
val := reflect.ValueOf(m["instances"]["arguments"]["password"])
fmt.Println("val=", val)
【问题讨论】:
-
你不需要反思,只需要type assertion。你也不需要
map[interface{}]interface{},只需要map[string]interface{}。 -
你试过用github.com/spf13/viper吗?
-
@MaddEye - 我尝试了 viper,但我只使用以下代码获得输出
map[]:m := make(map[string]interface{})err = viper.Unmarshal(&m)fatalIfErr(err)fmt.Println(m)val := viper.GetStringMap("instances.arguments.password")fmt.Println(val) -
我希望你意识到,如果你的 YAML 比你的小子集限制更少,并且包含标签、cmets、非十进制整数、引用/文字/折叠标量,这至少会被删除,它YAML 完全加载。