go - 替换 viper map 键而不替换整个 map

标签 go viper-go

我在配置中使用 viper。如何在不替换整个 map 的情况下替换 key ?

package main

import (
    "log"

    "github.com/spf13/viper"
)

type person struct {
    First string
    Last  string
}

func main() {
    v := viper.New()
    v.SetEnvPrefix("mememe")
    v.AutomaticEnv()

    bob := person{
        First: "Bob",
        Last:  "Smith",
    }

    john := person{
        First: "John",
        Last:  "Boothe",
    }

    v.SetDefault("people.bob", bob)
    v.SetDefault("people.john", john)
    log.Println(v.Get("people")) // map[bob:{Bob Smith} john:{John Boothe}]

    bob.Last = "Hope"
    v.Set("people.bob", bob)
    log.Println(v.Get("people")) // map[bob:{Bob Hope}]

}

设置新 Bob 后,我完全失去了 John。如果我将“SetDefault”更改为简单的“Set”,那么它似乎可以工作,但我想知道为什么“SetDefault”不起作用。

最佳答案

我猜是因为这个,来自 Accessing nested keys 上的文档.

However, if datastore.metric was overridden (by a flag, an environment variable, the Set() method, …) with an immediate value, then all sub-keys of datastore.metric become undefined, they are “shadowed” by the higher-priority configuration level.

因此,一旦设置了 people.bobpeople 就会出现,并且 people.* 不再被视为未填充。

我不知道如何解决它。

关于go - 替换 viper map 键而不替换整个 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44247616/

相关文章:

go - 在 Viper 中使用 ENV 变量覆盖配置的问题

go - 为什么我会根据调用 BindPFlag 的位置收到零指针错误?

go - 为什么 Cobra 不读取我的配置文件?

go - 如何使用 viper 将环境变量解码到 slice ?

http - 传入请求的上下文

forms - 如何为具有 gin(框架)和 golang 接口(interface)的表单制作通用表单函数?

go - 如何在另一个模块中使用 "GOPATH"之外的模块?

google-app-engine - 应用引擎去部署失败

go - 如何在 Golang 中生成唯一的随机字母数字标记?

unit-testing - 如何模拟Viper config getter