在 runtime2.go(go 1.10) 中定义了 goroutine 生命周期中所有可能的状态,虽然状态不多,不过其状态切换的可能性还是蛮多的,整理了一张图:

带上 GC 以后,图会比较乱,去掉 GC 相关的状态切换以后,会清爽许多。这里所有的 goroutine 状态切换都是由 runtime 的函数触发的,我们把 runtime 字样也从图上删除:

抽时间写写状态切换的文章。

再来一张 p 状态切换的: