gpt4 book ai didi

go - 如何在没有隐式缓冲区的情况下将值从一个 Go channel 传输到另一个 channel ?

转载 作者:IT王子 更新时间:2023-10-29 01:44:10 26 4
gpt4 key购买 nike

假设我有一个 goroutine,它从一个 channel 读取数据并写入另一个 channel 。

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

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

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

我基本上想等待 ch1ch2 都在会合点。

最佳答案

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

Both the channel and the value expression are evaluated before communication begins.

所以即使你这样做,似乎也不会缓冲任何变量中的值:

ch2 <- (<- ch1)

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

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

关于go - 如何在没有隐式缓冲区的情况下将值从一个 Go channel 传输到另一个 channel ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51394957/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com