Go语言中,协程(goroutine)通过go关键字实现轻量级并发,启动函数独立执行,需注意主协程等待、共享变量同步及循环变量捕获问题,常用sync.WaitGroup协调多个协程完成任务。

在Go语言中,协程(goroutine)是实现并发编程的核心机制。它比操作系统线程更轻量,启动和销毁的开销小,适合处理大量并发任务。使用 go 关键字可以轻松创建一个协程,让函数在独立的执行流中运行。
go关键字的基本用法
只需在函数调用前加上 go,即可启动一个协程:
go functionName()例如:
package mainimport ( "fmt" "time" )
func sayHello() { fmt.Println("Hello from goroutine") }
func main() { go sayHello() // 启动协程 time.Sleep(100 * time.Millisecond) // 等待协程执行 fmt.Println("Main function") }
输出可能是:
立即学习“go语言免费学习笔记(深入)”;
Hello from goroutine Main function注意:如果没有 time.Sleep,主程序可能在协程执行前就退出了,导致看不到输出。
协程与匿名函数
你也可以通过匿名函数的方式启动协程,适用于需要传参或临时逻辑的场景:
go func(msg string) { fmt.Println(msg) }("Hello inline goroutine")这种方式常用于一次性任务,避免定义额外函数。
协程间的协作与同步
多个协程并发执行时,主函数无法自动等待它们完成。常见做法是使用 sync.WaitGroup:
package mainimport ( "fmt" "sync" "time" )
func worker(id int, wg *sync.WaitGroup) { defer wg.Done() // 任务完成,通知WaitGroup fmt.Printf("Worker %d starting\n", id) time.Sleep(time.Second) fmt.Printf("Worker %d done\n", id) }
func main() { var wg sync.WaitGroup
for i := 1; i <= 3; i++ {
wg.Add(1)
go worker(i, &wg)
}
wg.Wait() // 等待所有协程完成
fmt.Println("All workers done")}
输出:
Worker 1 starting Worker 2 starting Worker 3 starting Worker 1 done Worker 2 done Worker 3 done All workers done注意事项
使用协程时需注意以下几点:
- 主协程退出后,其他协程也会被强制终止
- 协程之间共享变量时,要注意数据竞争,必要时使用互斥锁(sync.Mutex)
- 不要依赖协程的执行顺序,它们是并发调度的
- 避免在循环中直接使用循环变量,应传参避免闭包问题
基本上就这些。go关键字让并发变得简单,但合理管理协程生命周期和共享资源才是写出稳定程序的关键。










