Golang Go语言中 channel 的一个问题

发布于 1周前 作者 phonegap100 来自 Go语言

Golang Go语言中 channel 的一个问题

func main() {
ch := make(chan int, 1)
for i := 0; i < 10; i++ {
select {
case x := <-ch:
fmt.Println(x)
case ch <- i:
fmt.Println("—", i)
}
}
}

为什么输出的是:

--- 0
0
--- 2
2
--- 4
4
--- 6
6
--- 8
8

更多关于Golang Go语言中 channel 的一个问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

10 回复

chan 容量为 1 ,只能进一个再出一个

更多关于Golang Go语言中 channel 的一个问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


select 的 case 块之间,如果有多个 case 满足条件,会随机选择一个 case 块执行。
i = 1 的时候,选择了 case x := <-ch: 执行,下面的 case ch <- i 就不再执行,以此类推。实际开发中,chan 的入队和出队一般是由两个 goroutine 分别执行的

纠正一下 这里随机选择的特性没生效,i 为奇数时,只满足 case x := <-ch:

为 1 3 5… 的时候,输出上次的 0 2 4…

i = 1 ,3 ,5 的时候 ch 里有对象了,执行的 case x := <-ch:

偶数的时候往 ch 里写,奇数的时候读出来。所以跳过了

你可以在这里找到详细的解释: [基于 select 的多路复用]( https://book.itsfun.top/gopl-zh/ch8/ch8-07.html)

把每一个步骤打出来就好了:

循环 i = 0:
因为 ch 空,所以 x := <-ch 不会执行。
ch <- i 往通道里输入 0
输出 — 0

循环 i = 1:
因为 ch 里面有数据,所以 x := <- ch 得到上一次压入的 0
输出 0

循环 i = 2:
因为 ch 空,所以 x := <-ch 不会执行。
ch <- i 往通道里输入 2
输出 — 2

以此类推。。。

0: ch <- 0
1: x <- ch
2: ch <- 2
3: x <- ch

当然,以下是针对Go语言中channel的一个问题的专业回复:

在Go语言中,channel是一个非常重要的并发原语,它提供了一种在goroutine之间进行通信的方式。针对你提到的channel问题,我给出以下几点可能的解答和建议:

  1. 阻塞与非阻塞:首先确认你的channel操作是否涉及阻塞。发送操作到无缓冲或已满缓冲的channel会阻塞,接收操作从无缓冲或空缓冲的channel也会阻塞。确保你的goroutine逻辑正确处理了这些阻塞情况。

  2. 关闭channel:如果channel被关闭,但仍有goroutine试图向其发送数据,会导致panic。同样,从已关闭的channel接收数据会返回该类型的零值,并且第二个接收操作会立即返回false,表示channel已空。

  3. 数据丢失与竞争条件:使用channel时,要特别注意避免数据丢失和竞争条件。确保对channel的读写操作是同步和正确的,避免多个goroutine同时写入或读取同一个channel的同一位置。

  4. 容量与类型:channel的容量和类型也是影响其行为的关键因素。无缓冲channel的容量为0,有缓冲channel的容量可以指定。类型不匹配会导致编译错误。

  5. 调试与监控:如果问题依然难以解决,可以考虑使用Go的race detector来检测数据竞争,或者使用调试工具来监控channel的状态和goroutine的行为。

希望这些建议能帮助你解决Go语言中channel的问题。如果需要更具体的帮助,请提供更详细的代码和问题描述。

回到顶部