协程
概念说明
Go 中的协程通常指 goroutine。
使用 go 关键字可以让一个函数并发执行。
初学时可以先把 goroutine 理解成“一个可以和当前代码同时推进的轻量任务”。
它和操作系统线程不是完全一样的概念,但在学习并发时,你可以先抓住重点:goroutine 启动后,不会堵住当前代码继续往下走。
需要特别注意:
如果 main 函数结束,整个程序会退出,未执行完的 goroutine 也会一起结束。
语法/规则
- 使用
go 函数调用启动一个 goroutine。 - goroutine 的执行顺序由调度器决定,不要依赖固定顺序。
main函数不会自动等待其他 goroutine。- 需要等待任务结束时,应使用
sync.WaitGroup、channel 或其他同步方式。 - 多个 goroutine 共享变量时,要考虑线程安全问题。
语法模板
| |
启动 goroutine 示例
| |
输出结果(顺序可能不同):
| |
也可能是:
| |
注意这个细节
go printTask("goroutine") 不是先把这个函数执行完再往下走。
它只是启动一个新的 goroutine,主 goroutine 会立刻继续执行 printTask("main"),所以两边可能同时推进。
从运行结果就能看出来,它们不是固定顺序执行:
| |
也可能是:
| |
常见错误
- 启动 goroutine 后立即让
main结束,导致后台任务还没来得及执行。 - 依赖并发输出的固定顺序,实际不同机器或不同运行次数可能不一样。
- 多个 goroutine 同时修改同一个变量却不加同步保护,容易产生数据竞争。