去指针交换问题

时间:2019-01-19 21:25:44

标签: pointers 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的此函数内部以及该函数外部的相同指针中添加了一些打印,但是指针交换似乎并不能正常工作,因为config和外部打印该功能仍会打印以前的版本,而不是newConfig,这是我的理解,我也正在更改指针。

我刚开始使用Go,只是为了检查我是否会发疯,我已经在Cpp中重新创建了相同的东西,并且效果很好:

int *Temp1 = NULL;
int Temp2 = 123456;

Temp1 = &Temp2;

将Temp1的值设为123456(Temp2的数据)。有人可以让我知道我的Go代码在哪里出问题了吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

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