在站内找到个相同帖子 t/890739
问题是应该怎么升级呢?难道每个版本都实现一个类似 func Update(cfg ConfigV2)(ConfigV3, error)
的玩意? 这样岂不是每个 ConfigVx 的 struct 都得保留一份?
这种需求有没有现成的方案?
![]() | 1 COW 321 天前 via Android 考虑弄一个文件,代码里用 if else 判断当前软件的版本,动态生成差异配置 |
![]() | 3 COW 321 天前 via Android @lysShub 针对配置文件本身,可以用 template 语法来生成指定版本的配置文件。 针对代码内的 config 结构体,可以引入 version 字段,根据版本使用不同配置。 case v1:cOnfig= &ConfigV1{} case v2:cOnfig= &ConfigV2{} |
4 uds9u32br 321 天前 没什么问题啊,出现 break 更新之后还想要适配旧版本还能有什么办法呢,我真不知道 |
![]() | 5 v1 321 天前 如果有代码洁癖的话,就抛弃配置文件自动升级,或者单独写一个配置文件升级的转换工具。 |
![]() | 6 hellojukay 321 天前 via Android 参考 nginx 怎么升级配置文件的 |
![]() | 7 EscYezi 320 天前 via iPad 看起来像是 json 配置文件映射到 go 结构体,如果能把配置平铺做兼容可能就简单了。 比如现在配置文件是{“a”:{“b”:{“c”:12345}}},换成 a.b.c=12345 或者还是 json 配置文件,但是用 jsonpath 来解析。 |
![]() | 8 panlatent 320 天前 via Android 我的经验是不做复杂对象, 适当保留无效字段或者通过解析层处理掉无效数据。 我推荐前者,前一个大版本失效字段标记废弃,超两个大版本直接删除。 |