V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
yujianwjj
V2EX  ›  Go 编程语言

golang 代码重构求助

  •  
  •   yujianwjj · 2023-07-18 11:14:16 +08:00 · 2069 次点击
    这是一个创建于 492 天前的主题,其中的信息可能已经有所发展或是发生改变。
    type A {
    	Config string
    }
    

    A 是从文件中反序列化得到的。 之前 A.Config 是明文保存的,现在要求是改成密文。但是代码里面有大量使用 A.Config 的地方,我现在要每个使用 A.Config 地方都要修改,有点麻烦。有没有好的解决方案?

    13 条回复    2023-07-26 22:26:34 +08:00
    Nazz
        1
    Nazz  
       2023-07-18 11:28:08 +08:00
    封装个 GetConfig 方法, 替代直接访问
    javalaw2010
        2
    javalaw2010  
       2023-07-18 11:29:17 +08:00
    A 加个字段叫 SecretConfig,发序列化到这个字段上,然后顺手解密到 Config 字段上,其他不动
    aapeli
        3
    aapeli  
       2023-07-18 11:30:46 +08:00   ❤️ 3
    密文保存。明文使用??

    自定义 序列化和反序列化函数,在序列化函数中加密,在反序列化函数中解密

    例如,假设文件中的内容是 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))
    }
    lsk569937453
        4
    lsk569937453  
       2023-07-18 11:32:23 +08:00
    用 github copilot ,简直是重构神器。。。
    aapeli
        5
    aapeli  
       2023-07-18 11:33:01 +08:00
    这样的话 Config 底层类型是 string 可以直接当 string 用,不用改任何调用方的代码,内存里的 Config 存储的是明文. 只有在保存和加载的时候才是密文
    TuringGunner
        6
    TuringGunner  
       2023-07-18 11:42:18 +08:00
    Config 换成密文的,新增一个明文的字段用来读取文件初始化
    shellcodecow
        7
    shellcodecow  
       2023-07-18 11:45:06 +08:00
    @lsk569937453 #4 除了提示以外,有什么高级用法吗?
    YuuuuuuH
        8
    YuuuuuuH  
       2023-07-18 15:15:15 +08:00
    1. 先封装一个 `GetConfig() string`

    ```go
    func (a *A) GetConfig() string {
    return a.Config
    }
    ```

    2.使用 `gofmt` 批量替换引用 Config 的代码, `gofmt -d -r 'a.Config -> a.GetConfig()' <your-path>` (-d 表示只展示 diff ,不直接写入文件), 替换之后运行单元测试,保证不出错。
    3.改写`GetConfig` 方法,在方法中将密文解密成明文返回。
    hopingtop
        9
    hopingtop  
       2023-07-19 09:35:51 +08:00
    按照我的理解,OP 是不是想这样?

    type A struct {
    conf string `json:"Config"`// 存入你存入的配置
    Config string `json:"-"` // 这个先为空, 假设已 JSON 序列化做示例
    }

    然后你看看 A 这个结构体怎么生成的,是不是一次生成,到处用。
    如果是:那你就再 生成方法那里, 类似于 执行一个 Init() 方法,把 conf -> Config


    这样你在使用的地方用 A.Config 就不需要改动。

    如果这个结构体生成的地方很少,那么可能几行代码就解决了。
    hopingtop
        10
    hopingtop  
       2023-07-19 09:39:48 +08:00
    @hopingtop #9 我从 OP 的描述中。理解到的就是
    1. 之前 文件中是保存的 明文,现在想 文件中保存 密文
    2. 想改最少的代码,实现这个功能。

    得出上述建议,如果我理解错了,就当我没说 ~ ~#
    mingdongshensen
        11
    mingdongshensen  
       2023-07-19 12:18:30 +08:00
    也许可以用访问者的设计模式,定义访问者 visitor 去持有 config ,使用的地方调用 config 对象的方法,其内部在调用 config 所持有的特定的被预先注入的 visitor 对象的方法,相当于内部重定向了,最后在 visitor 被调的方法内去做解密工作
    shaoyie
        12
    shaoyie  
       2023-07-26 22:26:11 +08:00
    find . -name "*.go" | xargs sed -i -e 's/A\.Config/A.SecretConfig/g'
    shaoyie
        13
    shaoyie  
       2023-07-26 22:26:34 +08:00
    直接文件替换
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   949 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 21:30 · PVG 05:30 · LAX 13:30 · JFK 16:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.