Golang Go语言代码重构求助
type A {
Config string
}
A 是从文件中反序列化得到的。 之前 A.Config 是明文保存的,现在要求是改成密文。但是代码里面有大量使用 A.Config 的地方,我现在要每个使用 A.Config 地方都要修改,有点麻烦。有没有好的解决方案?
Golang Go语言代码重构求助
封装个 GetConfig 方法, 替代直接访问
更多关于Golang Go语言代码重构求助的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
A 加个字段叫 SecretConfig,发序列化到这个字段上,然后顺手解密到 Config 字段上,其他不动
密文保存。明文使用??
自定义 序列化和反序列化函数,在序列化函数中加密,在反序列化函数中解密
例如,假设文件中的内容是 json
type Config string
func (c *Config) UnmarshalJSON(data []byte) error {
var value string
if err := json.Unmarshal(data, &value); err != nil {
return err
}
// value 目前是密文
c.Value = jie_mi(value)
return nil
}
func (c Config) MarshalJSON() ([]byte, error) {
var value string = c
return json.Marshal(jia_mi(value))
}
用 github copilot ,简直是重构神器。。。
这样的话 Config 底层类型是 string 可以直接当 string 用,不用改任何调用方的代码,内存里的 Config 存储的是明文. 只有在保存和加载的时候才是密文
Config 换成密文的,新增一个明文的字段用来读取文件初始化
#4 除了提示以外,有什么高级用法吗?
- 先封装一个
GetConfig() string
go<br>func (a *A) GetConfig() string {<br> return a.Config<br>}<br>
2.使用gofmt
批量替换引用 Config 的代码,gofmt -d -r 'a.Config -> a.GetConfig()' <your-path>
(-d 表示只展示 diff ,不直接写入文件), 替换之后运行单元测试,保证不出错。
3.改写GetConfig
方法,在方法中将密文解密成明文返回。
按照我的理解,OP 是不是想这样?
type A struct {
conf string json:"Config"
// 存入你存入的配置
Config string json:"-"
// 这个先为空, 假设已 JSON 序列化做示例
}
然后你看看 A 这个结构体怎么生成的,是不是一次生成,到处用。
如果是:那你就再 生成方法那里, 类似于 执行一个 Init() 方法,把 conf -> Config
这样你在使用的地方用 A.Config 就不需要改动。
如果这个结构体生成的地方很少,那么可能几行代码就解决了。
#9 我从 OP 的描述中。理解到的就是
1. 之前 文件中是保存的 明文,现在想 文件中保存 密文
2. 想改最少的代码,实现这个功能。
得出上述建议,如果我理解错了,就当我没说 ~ ~#
也许可以用访问者的设计模式,定义访问者 visitor 去持有 config ,使用的地方调用 config 对象的方法,其内部在调用 config 所持有的特定的被预先注入的 visitor 对象的方法,相当于内部重定向了,最后在 visitor 被调的方法内去做解密工作
find . -name “*.go” | xargs sed -i -e ‘s/A.Config/A.SecretConfig/g’
直接文件替换