我正在尝试将指针交换为 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
}