我正在尝试在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代码在哪里出问题了吗?
谢谢!
答案 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
}