登录
首页 >  Golang >  Go问答

Go 通道之间如何直接传输值?

来源:stackoverflow

时间:2024-03-19 20:48:30 401浏览 收藏

在 Go 语言中,使用通道实现管道时,如果通道接收端被阻塞,发送端仍会继续从发送端读取值,从而在通道中引入缓冲区。然而,如果需要在完全锁步的方式下传输值,使通道发送和接收同时进行,则使用两个通道无法实现。因为在发送之前,发送的值必须已准备好并进行评估,这意味着接收端必须已准备好接收值,才能判断发送是否可以继续进行。因此,无法通过两个通道在原子操作中将值从一个通道传输到另一个通道。

问题内容

想象一下我有一个 goroutine 从一个通道读取并向另一个通道写入。

ch1 := make(chan int)
ch2 := make(chan int)
go func() {
  for num := range ch1 {
    ch2 <- num+1
  }
}()

如果 ch2 被阻塞,goroutine 仍会从 ch1 读取值,从而有效地在通道中引入 1 的缓冲区。由于我使用通道来控制流,所以我不需要任何缓冲。

如何制作一个以完全锁步方式执行的管道? 或者换句话说,如何在一个原子操作中将值从一个通道传输到下一个通道?

我基本上想等待 ch1ch2 到达集合点。


解决方案


你不能用 2 个通道来做到这一点。为了在 ch2 上执行发送,要发送的值必须已准备好并进行评估。 Spec: Send statements:

在通信开始之前,会对通道和值表达式进行评估。

因此,即使您这样做,它似乎也不会缓冲任何变量中的值:

ch2 <- (<- ch1)

不过,来自 ch1 的接收将首先被评估,然后才会尝试发送。

这意味着该值必须已经从 ch1 收到。但是,如果不尝试在 ch2 上发送,您就无法判断是否有人在 ch2 上“监听”(意味着 ch2 上的发送是否可以继续进行)(即使可以,也不能保证在检查后尝试发送会仍然有人在听)。

终于介绍完啦!小伙伴们,这篇关于《Go 通道之间如何直接传输值?》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>