并发编程
goroutine 和 channel 是 Go 并发的核心。goroutine 是轻量线程(go 关键字启动),channel 是 goroutine 之间通信的管道("不要通过共享内存通信,要通过通信共享内存")。
goroutine
go 函数() 就启动一个并发任务,成千上万个没问题。
channel
ch := make(chan int) 创建;ch <- x 发送;x := <-ch 接收。默认无缓冲(发送和接收要同时就绪),可带缓冲 make(chan int, 10)。
select
select 同时等待多个 channel,谁有数据处理谁,实现超时、多路复用。
代码示例
package main
import (
"fmt"
"sync"
"time"
)
func worker(id int, wg *sync.WaitGroup) {
defer wg.Done()
fmt.Printf("任务 %d 开始\n", id)
time.Sleep(time.Millisecond * 300)
fmt.Printf("任务 %d 完成\n", id)
}
func main() {
// WaitGroup 等待所有 goroutine
var wg sync.WaitGroup
for i := 1; i <= 5; i++ {
wg.Add(1)
go worker(i, &wg)
}
wg.Wait()
fmt.Println("全部完成")
// channel 通信
ch := make(chan string)
go func() {
ch <- "来自子 goroutine 的消息"
}()
msg := <-ch
fmt.Println(msg)
}