我正在玩 channel 。我下面的代码包含一个for循环。我不明白为什么程序似乎跳过其他所有迭代,以及为什么最后一个值为0。
package main
import (
"fmt"
"time"
)
func send(c chan int) {
for i := 1; i < 6; i++ {
time.Sleep(time.Second)
c <- i
}
close(c)
}
func main() {
c := make(chan int)
go send(c)
for range c {
fmt.Println(<-c)
}
}
输出:
2
4
0
最佳答案
您应该先查看golang导览。
https://tour.golang.org/concurrency/4
您同时使用两种不同的阅读方式:for range c
从c channel 读取一次,然后使用<-c
从 channel 再次读取
如果您想写出发送给 channel 的内容,只需使用以下方法之一:
for value := range c {
fmt.Println(value)
}
OR
for {
select {
case value, ok := <- c:
if !ok {
return
}
fmt.Println(value)
}
}
由于您的迭代次数为奇数(1..5),因此从封闭 channel 中读取(类型的默认值)会显示最后一个0。
如果使用
value, ok := <-c
且从中读取 channel 时将其关闭,则该值将始终为默认值,而ok
将为false
。
关于go - 在for循环中写入 channel 会跳过迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62169158/