0

我在我的配置中使用 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”不起作用。

4

1 回答 1

0

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

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

因此,一旦people.bob设置,就会出现people并且people.*不再被认为是无人居住的。

我不知道如何解决它。

于 2017-05-29T17:37:32.963 回答