ZBLOG

这段代码修改backup_hactrl.conf 把hactrl.conf也修改了

你是正确的,这段代码中的赋值操作 backupConfig = config 并没有创建一个新的副本,而是将 config 的引用赋给了 backupConfig。因此,对 backupConfig 的修改会同时影响到原始的 config

如果你想要备份 hactrl.confbackup_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助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=18378

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?