Go 指针交换问题



我正在尝试将指针交换为 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 以及函数外部的相同指针,但是指针交换似乎无法正常工作,因为配置和函数外的打印仍然打印以前的版本,而不是 newConfig,我的理解我也在更改指针。

我对 Go 很陌生,只是为了检查我不会发疯,我已经在 CPP 中重新创建了同样的东西并且它有效:

int *Temp1 = NULL;
int Temp2 = 123456;
Temp1 = &Temp2;

它将使 Temp1 成为值123456(Temp2 的数据)。有人可以让我知道我的 Go 代码哪里出错了吗?

谢谢!

我建议将实际的配置值放在锁下变异的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
}

最新更新