Go 语言并发编程第二部分:通道

发布日期:2026-05-01 10:01:40   浏览量 :1
发布日期:2026-05-01 10:01:40  
1

2026西湖龙井茶官网DTC发售:茶农直供,政府溯源防伪到农户家 

“Go 语言中的并发”系列文章的第二部分中,我们将讨论推荐用于多个 goroutine 之间通信的方法,即通道(Channel)。

通道(Channel)

根据最佳实践,并发通信的指导原则是:

“不要通过共享内存来通信;而应通过通信来共享内存。”

因此,在多个协程(routine)之间进行通信时,我们通常不会修改共享变量的值,而是通过通道(channel)来传递值。

通道是一种类型化变量,必须在创建时指定将要传输的数据类型。

  • 向通道发送值的写法为 c <- v
  • 从通道接收值的写法为 <- c

其中 c 代表通道,v 代表变量值。

示例

func multiply(v1 int, v2 int, c chan int) {
  c <- v1 * v2
}
func main() {
  c := make(chan int)
  go multiply(1, 2, c)
  go multiply(3, 4, c)
  a := <- c
  b := <- c
  fmt.Println(a * b)
}

可以看到,代码中并没有使用等待组(WaitGroup),但主函数(main)也没有提前结束。这是因为通道本身具有阻塞机制:当尝试接收或发送数据时,它会自动暂停等待。

  • 阻塞向通道发送值,直到该值被接收为止。
  • 阻塞从通道接收值,直到有值被发送进来为止。

这意味着,我们可以利用通道来实现类似于等待组(WaitGroup)的等待功能。例如,使用布尔型通道来等待任务完成的信号。

ready := make(chan bool)
go foo(ready)
<-ready

程序会一直等待,直到 foo() 函数向 ready 通道发送一个真值(true)。(实际上发送假值(false)也能达到等待效果,但按照规范应发送真值。)

请注意,我们并没有实际使用接收到的值,仅仅是为了等待通道中有值传入。

在使用通道接收数据流时

免责声明:本文内容来自互联网,该文观点不代表本站观点。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请到页面底部单击反馈,一经查实,本站将立刻删除。

关于我们
热门推荐
合作伙伴
免责声明:本站部分资讯来源于网络,如有侵权请及时联系客服,我们将尽快处理
支持 反馈 订阅 数据
回到顶部