一、channel:用通信代替共享内存
Go 哲学:”不要通过共享内存来通信,而要通过通信来共享内存”。channel 是 goroutine 间传递数据的管道。
ch := make(chan int, 3) // 缓冲容量 3
ch <- 1 // 发送
v := <-ch // 接收
| 类型 | 行为 |
|---|---|
| 无缓冲 | 发送接收必须同时就绪(同步) |
| 有缓冲 | 缓冲未满可异步发送 |
二、select 多路复用
select {
case v := <-ch1: fmt.Println(v)
case ch2 <- 10: fmt.Println("sent")
default: fmt.Println("非阻塞")
}
select 随机选一个就绪分支,default 让收发非阻塞,避免死锁。
三、常见坑
- 向已
close的 channel 发送会 panic; - 重复 close 也会 panic(用 once 或只由发送方关);
- 用
for v := range ch持续接收,直到 channel 关闭; - 无缓冲 channel 忘记接收会死锁。