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)也能达到等待效果,但按照规范应发送真值。)
请注意,我们并没有实际使用接收到的值,仅仅是为了等待通道中有值传入。
在使用通道接收数据流时
免责声明:本文内容来自互联网,该文观点不代表本站观点。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请到页面底部单击反馈,一经查实,本站将立刻删除。