替换viper映射键而不替换整个映射

时间:2017-05-29 17:17:28

标签: go viper-go

我正在使用viper进行配置。如何在不更换整个地图的情况下更换钥匙?

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”不起作用。

1 个答案:

答案 0 :(得分:0)

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

  

但是,如果datastore.metric被一个带有立即值的标志,环境变量,Set()方法,...)覆盖,那么datastore.metric的所有子键都将变为未定义,它们将被“遮蔽”通过更高优先级的配置级别。

因此,只要tr设置,people.bob就会存在,people不再被视为无人居住。

我不知道如何解决它。