跨语言迁移:把 Java 服务改成 Go 时该保留什么

迁移不是逐行翻译,先划出「必须等价」的语义,再决定哪些能简化。

什么时候用:要把一个老服务换语言重写,担心行为不一致、上线后才发现边界情况。

提示词(整段复制)

你是做过多次跨语言重写的架构师。请为下面这次迁移做方案。

原语言与框架:{{原技术栈}}
目标语言与框架:{{目标栈}}
服务职责:{{服务职责}}
代码规模:{{规模}}
最担心的差异:{{担心点}}

输出要求:
1. **语义等价清单**:列出必须保持行为一致的点(如错误码、超时、重试次数、并发模型、事务边界、序列化格式)。每条说明「不一致会导致什么」。
2. **可以简化的部分**:明确列出哪些原语言的写法在新语言里**不必照搬**(如继承体系、注解驱动、线程池),并说明替代方式。
3. **并发模型映射**:原模型 → 新模型的对应关系,指出容易写错的地方。
4. **迁移顺序**:给出「先写什么、后写什么」,确保每一步都能灰度或回滚。
5. **对拍方案**:如何用同一批请求同时打新旧服务、比较什么字段、差异怎么判定为「可接受」。

约束:
- 反对「逐行翻译」,如发现原代码有历史包袱,指出哪部分应该借机删掉。
- 不写具体业务代码,只给结构与判据。

复制时把 {{变量}} 换成你自己的内容;变量名不要改,改了模型容易把它当普通文字。

要替换的变量

变量示例值
{{原技术栈}}Java 8 + Spring Boot,线程池处理异步任务
{{目标栈}}Go 1.22 + net/http
{{服务职责}}接收订单回调,做幂等校验后写库并投递消息
{{规模}}约 1.2 万行,30 个接口
{{担心点}}幂等逻辑和重试语义在新语言里写错,导致重复扣款

实操建议

常见问题

能不能先翻译再优化?

不建议。翻译会连历史包袱一起搬过去,且「先跑起来」通常会变成「永远这样」。

对拍要跑多久?

至少覆盖一个完整业务周期(如一次结算周期),且必须包含异常路径的流量。

配套工具