ZBLOG

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

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

如果你想要备份 hactrl.confbackup_hactrl.conf 而保持它们之间的独立性,可以使用深拷贝来创建副本。以下是一个示例代码:

  1. package main
  2. import (
  3. "fmt"
  4. "os"
  5. "path/filepath"
  6. "github.com/go-ini/ini"
  7. )
  8. type HaConfiguration struct {
  9. Required struct {
  10. LocalIP string
  11. PeerIP string
  12. }
  13. }
  14. func backupHAConfig(haConfigPath, peerIP string) error {
  15. config := &HaConfiguration{}
  16. err := loadIniConfig(haConfigPath, "hactrl.conf", config)
  17. if err != nil {
  18. return err
  19. }
  20. fmt.Printf("Original Config: %+v\n", config)
  21. filePath := filepath.Join(haConfigPath, "backup_hactrl.conf")
  22. if _, err := os.Stat(filePath); os.IsNotExist(err) {
  23. file, err := os.Create(filePath)
  24. if err != nil {
  25. fmt.Println("Cannot create backup_hactrl.conf")
  26. return err
  27. }
  28. defer file.Close()
  29. }
  30. backupConfig := &HaConfiguration{}
  31. err = loadIniConfig(haConfigPath, "hactrl.conf", backupConfig)
  32. if err != nil {
  33. return err
  34. }
  35. copyFields(config.Required, &backupConfig.Required)
  36. updateFields(backupConfig.Required, peerIP)
  37. err = writeIniConfig(haConfigPath, "backup_hactrl.conf", backupConfig)
  38. if err != nil {
  39. return err
  40. }
  41. fmt.Printf("Modified Config: %+v\n", config)
  42. fmt.Printf("Backup Config: %+v\n", backupConfig)
  43. return nil
  44. }
  45. func loadIniConfig(configPath, configFile string, data interface{}) error {
  46. cfg, err := ini.Load(filepath.Join(configPath, configFile))
  47. if err != nil {
  48. return err
  49. }
  50. return cfg.MapTo(data)
  51. }
  52. func writeIniConfig(configPath, configFile string, data interface{}) error {
  53. cfg := ini.Empty()
  54. err := cfg.ReflectFrom(data)
  55. if err != nil {
  56. return err
  57. }
  58. filePath := filepath.Join(configPath, configFile)
  59. return cfg.SaveTo(filePath)
  60. }
  61. func copyFields(dest, src interface{}) {
  62. destValue := reflect.ValueOf(dest).Elem()
  63. srcValue := reflect.ValueOf(src).Elem()
  64. for i := 0; i < destValue.NumField(); i++ {
  65. destField := destValue.Field(i)
  66. srcField := srcValue.Field(i)
  67. destField.Set(srcField)
  68. }
  69. }
  70. func updateFields(obj interface{}, peerIP string) {
  71. objValue := reflect.ValueOf(obj).Elem()
  72. ipField := objValue.FieldByName("LocalIP")
  73. ipField.SetString(peerIP)
  74. }
  75. func main() {
  76. err := backupHAConfig("/path/to/config/directory", "192.168.0.2")
  77. if err != nil {
  78. fmt.Println(err)
  79. }
  80. }

这个示例代码中,我使用了 github.com/go-ini/ini 包来加载和保存配置文件。在 copyFields() 函数中,我通过反射将源结构体的字段值复制到目标结构体中,以实现深拷贝。在 updateFields() 函数中,我传入了要更新的结构体和新的 peerIP 值,并使用反射设置字段的新值。这样,对备份配置文件的修改就不会影响到原始配置文件了。


内容由零声教学AI助手提供,问题来源于学员提问

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?