Заменить ключ карты Viper без замены всей карты

Я использую 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" не работает.

1 ответ

Решение

Я собираюсь догадаться, что это из-за этого, из документов о доступе к вложенным ключам.

Однако, если datastore.metric был переопределен (с помощью флага, переменной среды, метода Set() и т. Д.) С непосредственным значением, то все вложенные ключи datastore.metric становятся неопределенными, они "затеняются" более высоким приоритетный уровень конфигурации.

Так что, как только people.bob установлено, people возникает и существует people.* больше не считаются безлюдными.

Я не знаю, как обойти это.

Другие вопросы по тегам