Go 面试题:channel 与 select 多路复用

一、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 忘记接收会死锁。