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

标签 go channel

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

相关文章:

windows - 如何解析文件路径中的用户环境变量

SQL插入接口(interface) slice

hadoop - 用于 Hadoop Streaming 的 Go 客户端

audio - Directshow中音频 channel 的数量大于2时,如何控制每个 channel 的音量?

go - Goroutine 中关于关键字 "go"和没有关键字的比较

go - 处理不同类型的消息 - 一个还是多个 channel ?

post - 带有 Go 后端的 Flutter/Dart 前端中的发布请求问题

go - 处理超时并收听 channel

go - 如何定义动态接口(interface)/结构

c# - 无法使用权​​限 'apps.ika.gr' 为 SSL/TLS 建立安全通道