gpt4 book ai didi

go - 在for循环中写入 channel 会跳过迭代

转载 作者:行者123 更新时间:2023-12-01 21:15:58 25 4
gpt4 key购买 nike

我正在玩 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/

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