为了账号安全,请及时绑定邮箱和手机立即绑定

Go 例程没有接收到通过通道发送的所有数据——玩具示例程序

Go 例程没有接收到通过通道发送的所有数据——玩具示例程序

Go
临摹微笑 2021-11-29 19:36:59
我只是在玩弄Go,可以这么说。我遇到了一个问题,一个旨在接收3整数的 go 例程似乎只接收一个。type simpleFunction func() intfunc run(fChan chan simpleFunction, result chan int) {  for{    select {    case fn := <-fChan:      fmt.Printf("sending: %d down result chan\n", fn())      result <- fn()    case <-time.After(time.Second * 2):      close(fChan)    }  }}func recieve(result chan int){  for {    select {    case x := <-result:      fmt.Printf("recieved: %d from result chan\n", x)    case <-time.After(time.Second * 2):      close(result)    }  }}因此,正如您所看到的,run例程接收函数,评估它们,然后将结果发送到result通道中。这是我的main/ test:func main() {  fns := []simpleFunction{    func() int {return 1},    func() int {return 2},    func() int {return 3},  }  fChan := make(chan simpleFunction)  result := make(chan int)  go run(fChan, result)  go recieve(result)  for _, fn := range fns {    fmt.Printf("sending a function that returns: %d down function chan\n", fn())    fChan <- fn  }} 这是我的输出:sending a function that returns: 1 down function chansending: 1 down result chanrecieved: 1 from result chansending a function that returns: 2 down function chansending a function that returns: 3 down function chansending: 2 down result chansending: 3 down result chan所以,正如你所看到的,第一个功能似乎一切顺利,但之后就没有那么热了。任何提示或建议?
查看完整描述

1 回答

?
SMILET

TA贡献1796条经验 获得超4个赞

这段代码有几个问题:

  • 当 main 返回时程序终止。它不会等待runreceivegoroutine 完成。

  • 关闭频道是一场竞赛。不能保证发件人在超时之前将发送最多。

  • 如果 main 没有退出,那么for { select { } }循环将永远旋转打印零值。在关闭的通道上接收返回零值。


查看完整回答
反对 回复 2021-11-29
  • 1 回答
  • 0 关注
  • 121 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信