跳到主要内容

channel 通信

基本概念

概念

  • channel: goroutine 之间传递值的通信管道;
  • channel 元素类型: 决定管道中传递的值类型;

语法格式

func main() {
ch := make(chan int) // 创建传递 int 的 channel
go func() {
ch <- 10 // 向 channel 发送值
}()
n := <-ch // 从 channel 接收值
println(n)
}

无缓冲 channel

概念

  • unbuffered channel: 没有缓冲空间;
  • 同步语义: 发送和接收同时完成值交接;
  • 发送完成条件: 必须有接收者接收该值;
  • 接收完成条件: 必须有发送者发送值;
  • 使用定位: 不是队列,而是 goroutine 之间的同步交接点;

语法格式

func main() {
ch := make(chan string)

go func() {
ch <- "ok" // 阻塞到另一个 goroutine 执行接收
}()

println(<-ch) // 双方都就绪时完成值交接
}

有缓冲 channel

概念

  • buffered channel: 拥有固定容量缓冲区;
  • 发送阻塞: 缓冲区满时阻塞;
  • 接收阻塞: 缓冲区空时阻塞;

语法格式

func main() {
ch := make(chan int, 2) // 容量为 2
ch <- 1 // 缓冲未满,发送不阻塞
ch <- 2
println(<-ch, <-ch) // 输出 1 2
}