Проблема с заменой указателя - PullRequest
0 голосов
/ 20 января 2019

Я пытаюсь поменять указатель на структуру в Go, запустив функцию, которая к нему привязана:

func ( config *Config ) ReLoadConfigFile( configPath string ) error {
if ( len( configPath ) > 0 ) {
    newConfig := Config{};
    err := newConfig.LoadFromFile( configPath );

    //Swap the configs, ensuring to lock the config for the swap
    if ( err == nil ) {
        config.Lock.Lock( );
        defer config.Lock.Unlock( );
        config = &newConfig;
    } else {
        errorString := "Unable To Reload Config At Path: " + configPath;
        return fmt.Errorf( errorString );
    }
} else {
    return fmt.Errorf( "No Config Given To Reload" );
}
return nil;

}

Я добавил несколько отпечатков, как внутри этой функции для config и newConfig, так и для одного и того же указателя вне функции, однако не похоже, что замена указателя работает правильно, так как config и печать вне функция все еще печатает предыдущую версию, а не newConfig, насколько я понимаю, я тоже меняю указатель.

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

int *Temp1 = NULL;
int Temp2 = 123456;

Temp1 = &Temp2;

Где это сделает Temp1 значением 123456 (данные Temp2). Может кто-нибудь, пожалуйста, дайте мне знать, где я иду не так в моем коде Go?

Спасибо!

1 Ответ

0 голосов
/ 20 января 2019

Я предлагаю поместить фактические значения конфигурации в поле структуры Config, которая мутирует под блокировкой, а не изменяет указатель Config, потому что при встрече с вызывающими методами метод все равно будет иметь ссылку на старый указатель.

Например:

type Config struct {
    values map[string]interface{} // or whatever is appropriate for your config
    lock   sync.RWMutex
}

func (c *Config) Get(k string) (interface{}, bool) {
    c.lock.RLock()
    defer c.lock.RUnlock()
    v, ok := c.values[k]
    return v, ok
}

func (c *Config) Reload(path string) error {
    newConfig, err := LoadFromFile(path)
    if err != nil {
        return err
    }
    c.lock.Lock()
    defer c.lock.Unlock()
    c.values = newConfig.values
    return nil
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...