Как функция, принимающая параметр интерфейса {}, может обновить значение, вызываемое по ссылке? - PullRequest
0 голосов
/ 18 апреля 2019

У меня есть пакет с именем server, который содержит структуру Settings.Он содержит такой код:

type Settings struct {
    foobar String
}

func example() {
    readSettings := Settings{}
    err := storage.GetSettings(&readSettings)
    // Problem: at this point, readSettings has not been changed!
}

Моя проблема в том, что readSettings не обновляется.

В пакете storage есть функция GetSettings:

func GetSettings(settingsToPopulate interface{}) error {
    file, _ := os.Open("/tmp/settings.json")
    var decodedSettings interface{}
    json.NewDecoder(file).Decode(&decodedSettings)
    settingsToPopulate = decodedSettings
    return nil
}

Мои ограничения заключаются в том, что структура Settings должна оставаться в server, а метод ввода-вывода GetSettings сильно сохраняется в storage.

Я не могу просто сделать GetSettingsпримите структуру Settings, потому что это вызовет циклическую зависимость.

Как я могу обновить ссылочный параметр GetSettings?

1 Ответ

4 голосов
/ 18 апреля 2019

Здесь вам не нужно использовать промежуточную переменную decodedSettings.Вместо этого, используя указатель readSettings, который вы передадите напрямую, пакет JSON будет десериализован вместо этого.

Ваш код станет:

func GetSettings(settingsToPopulate interface{}) error {
    file, _ := os.Open("/tmp/settings.json")
    return json.NewDecoder(file).Decode(settingsToPopulate)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...