你是正确的,这段代码中的赋值操作 backupConfig = config
并没有创建一个新的副本,而是将 config
的引用赋给了 backupConfig
。因此,对 backupConfig
的修改会同时影响到原始的 config
。
如果你想要备份 hactrl.conf
到 backup_hactrl.conf
而保持它们之间的独立性,可以使用深拷贝来创建副本。以下是一个示例代码:
package main
import (
"fmt"
"os"
"path/filepath"
"github.com/go-ini/ini"
)
type HaConfiguration struct {
Required struct {
LocalIP string
PeerIP string
}
}
func backupHAConfig(haConfigPath, peerIP string) error {
config := &HaConfiguration{}
err := loadIniConfig(haConfigPath, "hactrl.conf", config)
if err != nil {
return err
}
fmt.Printf("Original Config: %+v\n", config)
filePath := filepath.Join(haConfigPath, "backup_hactrl.conf")
if _, err := os.Stat(filePath); os.IsNotExist(err) {
file, err := os.Create(filePath)
if err != nil {
fmt.Println("Cannot create backup_hactrl.conf")
return err
}
defer file.Close()
}
backupConfig := &HaConfiguration{}
err = loadIniConfig(haConfigPath, "hactrl.conf", backupConfig)
if err != nil {
return err
}
copyFields(config.Required, &backupConfig.Required)
updateFields(backupConfig.Required, peerIP)
err = writeIniConfig(haConfigPath, "backup_hactrl.conf", backupConfig)
if err != nil {
return err
}
fmt.Printf("Modified Config: %+v\n", config)
fmt.Printf("Backup Config: %+v\n", backupConfig)
return nil
}
func loadIniConfig(configPath, configFile string, data interface{}) error {
cfg, err := ini.Load(filepath.Join(configPath, configFile))
if err != nil {
return err
}
return cfg.MapTo(data)
}
func writeIniConfig(configPath, configFile string, data interface{}) error {
cfg := ini.Empty()
err := cfg.ReflectFrom(data)
if err != nil {
return err
}
filePath := filepath.Join(configPath, configFile)
return cfg.SaveTo(filePath)
}
func copyFields(dest, src interface{}) {
destValue := reflect.ValueOf(dest).Elem()
srcValue := reflect.ValueOf(src).Elem()
for i := 0; i < destValue.NumField(); i++ {
destField := destValue.Field(i)
srcField := srcValue.Field(i)
destField.Set(srcField)
}
}
func updateFields(obj interface{}, peerIP string) {
objValue := reflect.ValueOf(obj).Elem()
ipField := objValue.FieldByName("LocalIP")
ipField.SetString(peerIP)
}
func main() {
err := backupHAConfig("/path/to/config/directory", "192.168.0.2")
if err != nil {
fmt.Println(err)
}
}
这个示例代码中,我使用了 github.com/go-ini/ini
包来加载和保存配置文件。在 copyFields()
函数中,我通过反射将源结构体的字段值复制到目标结构体中,以实现深拷贝。在 updateFields()
函数中,我传入了要更新的结构体和新的 peerIP
值,并使用反射设置字段的新值。这样,对备份配置文件的修改就不会影响到原始配置文件了。
内容由零声教学AI助手提供,问题来源于学员提问