Go语言通过goroutine和channel实现高效并发,goroutine是轻量级线程,用go关键字启动,开销小;配合sync.WaitGroup协调执行,确保主函数等待所有任务完成;通过channel进行数据传递,避免共享内存,实现安全通信。

Go语言的并发能力是其核心优势之一,它通过goroutine和channel提供了简单高效的并发编程模型。理解这些基础概念并掌握基本用法,是编写高性能Go程序的关键。
什么是Goroutine
Goroutine是Go运行时管理的轻量级线程,由Go runtime调度,开销极小。启动一个goroutine只需在函数调用前加上go关键字。
与操作系统线程相比,goroutine的栈空间初始很小(通常2KB),可动态伸缩,因此可以轻松创建成千上万个goroutine而不影响性能。
示例:func sayHello() {
fmt.Println("Hello from goroutine")
}
func main() {
go sayHello() // 启动一个goroutine
time.Sleep(100 * time.Millisecond) // 等待goroutine执行完成
fmt.Println("Main function")
}
如何有效使用Goroutine
实际开发中,直接使用time.Sleep等待并不现实。更合理的做法是使用sync.WaitGroup来协调多个goroutine的执行。
立即学习“go语言免费学习笔记(深入)”;
- WaitGroup用于等待一组操作完成
- Add增加计数,Done减少计数,Wait阻塞直到计数归零
func worker(id int, wg *sync.WaitGroup) {
defer wg.Done()
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() // 阻塞直到所有worker完成
fmt.Println("All workers finished")}
配合Channel进行通信
Goroutine之间不应共享内存,而应通过channel传递数据。channel是Go中用于goroutine间通信的管道,支持值的发送和接收。
- 使用make(chan Type)创建channel
- 可设置缓冲区大小,实现异步通信
func fetchData(ch chan string) {
time.Sleep(2 * time.Second)
ch <- "data fetched"
}
func main() {
ch := make(chan string)
go fetchData(ch)
result := <-ch // 接收数据
fmt.Println(result)
}
基本上就这些。掌握goroutine的基本用法、配合WaitGroup做同步、用channel做通信,就能应对大多数并发场景。不复杂但容易忽略的是:别忘了协调生命周期,避免主函数退出过早导致goroutine没机会执行。










