Go 替换viper地图键而不替换整个地图

Go 替换viper地图键而不替换整个地图,go,viper-go,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 :

我的配置使用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}]

}

在设置新鲍勃时,我完全失去了约翰。如果我将“SetDefault”改为简单的“Set”,那么它似乎可以工作,但我想知道为什么“SetDefault”不能工作。

从文档上看,我猜是因为这个原因

但是,如果datastore.metric被立即值覆盖(通过标志、环境变量、Set()方法等),则datastore.metric的所有子键都将被未定义,它们将被更高优先级的配置级别“隐藏”

因此,只要设置了
people.bob
people
就开始存在,
people.*
不再被视为无人居住


我不知道如何解决这个问题。

我想这是有道理的,但话说回来,这是没有道理的。@kristen可能值得报道为一个bug/misfeature。闻起来像是实现的一个怪癖,而不是一个特性。