我只是在玩弄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 返回时程序终止。它不会等待
run
和receive
goroutine 完成。关闭频道是一场竞赛。不能保证发件人在超时之前将发送最多。
如果 main 没有退出,那么
for { select { } }
循环将永远旋转打印零值。在关闭的通道上接收返回零值。
- 1 回答
- 0 关注
- 121 浏览
添加回答
举报
0/150
提交
取消