从 PHP 到 Go:一个老 PHP 的转型路线图

写了 10 年 PHP(Yii2 → Laravel → Swoole),2022 年开始转 Go。两年下来主导了核心服务 PHP → Go 的重构。经常有人问"老 PHP 转 Go 怎么走",这篇是我的完整路线图。

一、先回答最核心的问题:要不要转

先别急着转,想清楚这三点:

  1. 业务有没有高并发压力?PHP 的瓶颈在常驻进程和并发模型(PHP-FPM 每请求一个进程),如果你的服务 QPS 上千就要想,几十就再等等
  2. 团队有没有 Go 场景?转语言不是为了简历好看,是团队真有微服务/高并发要用 Go 的场景
  3. 你愿不愿意重新当三个月新手?Go 上手快,但写出"PHP 味的 Go"很容易,真正内化要半年+

我的判断标准:业务逼你转 + 团队支持转 + 你自己想转,三个都满足才转。

二、学习路线(按顺序)

第一阶段:语法速通(2 周)

不要看大部头,直接:

  • A Tour of Go 官方教程走一遍(半天)
  • 写 10 个 LeetCode 简单题(熟悉切片、map、错误处理)
  • 读一遍《Go 语言圣经》并发章节(goroutine/channel 是重点)

关键:忘掉 PHP 的思维。PHP 是"每请求一脚本",Go 是"长驻进程 + 并发",心态先切换。

第二阶段:Web 实战(3-4 周)

  • 用 Gin 写一个 CRUD 服务,带 JWT 鉴权 + MySQL
  • 学会 context(超时、取消是 Go 的核心哲学)
  • 学会结构体 + JSON 序列化(对比 PHP 的数组,Go 的强类型让你难受一个月,之后再也回不去)

第三阶段:并发与工程化(6-8 周)

  • goroutine + channel 模式:worker pool、fan-out/fan-in
  • 生产要用的东西:pprof 性能分析、错误处理规范、配置管理、日志库选型
  • 读自己团队的 Go 代码:找一个你熟悉的业务模块,看懂别人怎么写的

第四阶段:上生产(持续)

不要等学完才动手,找一个低风险模块(比如一个内部管理接口)用 Go 重写上线,让业务逼你成长。

三、踩过的坑(价值最高)

坑 1:用 PHP 的方式写 Go

1
2
3
4
5
// 错误写法(PHP 思维:函数返回结果)
func GetUser(id int) *User { ... }  // 错误被吞了

// Go 思维:显式返回 error
func GetUser(ctx context.Context, id int) (*User, error) { ... }

Go 的错误处理不是啰嗦,是显式if err != nil 写多了就懂:没有异常机制的语言里,错误必须被看见、被处理或被记录。

坑 2:goroutine 泄漏

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
// 错误:goroutine 永远等不到结果
go func() { ch <- result }()   // 没人收,泄漏

// 正确:select + 超时
select {
case r := <-ch:
    return r
case <-ctx.Done():
    return nil, ctx.Err()
}

goroutine 和 PHP 进程完全不同:PHP 进程结束就清理,goroutine 泄漏会慢慢吃光内存。上线第一课就是 pprof goroutine 排查泄漏。

坑 3:interface{} 滥用

转 Go 初期最想把一切变成 interface{}(就是 PHP 的数组/混合类型)。结果:类型安全感全丢,到处断言。

正确姿势:能用强类型就用强类型,interface{} 只用在边界(JSON 解析、反射)。

坑 4:panic 当异常用

PHP 有 try-catch,Go 的 panic 不是异常——panic 会炸掉整个进程。业务错误一律 return error,panic 只留给"程序不可能继续运行"的场景(如配置缺失、端口被占)。

四、什么时候算"转型成功"

我的判断标准:

  1. 新代码不用翻译 PHP 思维,直接写 Go 习惯的代码
  2. 能看懂 pprof 火焰图,能定位 goroutine 泄漏
  3. 敢在生产上写并发代码(channel、并发安全)
  4. 被问"Go 和 PHP 并发模型区别"能讲 10 分钟

平均需要 6 个月到 1 年。别焦虑,Go 的上手曲线比 PHP 陡一点点,但天花板高很多。

五、写在最后

转 Go 最大的收获不是语言本身,是思维升级:从"请求处理"思维到"系统架构"思维,从"脚本"到"工程"。PHP 教会我快速交付,Go 教会我严谨工程——两个都值得。

如果你正在纠结转不转,记住:转型不是放弃 PHP,是给职业生涯加一条更长的跑道。