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

golang:select 语句中的通道有时只接收(???)

golang:select 语句中的通道有时只接收(???)

Go
幕布斯7119047 2021-09-10 21:33:02
我在从两个通道接收的 go 例程中有一个 select 语句。for {    fmt.Printf("Waiting for select statement ...\n")    select {    case req := <-requestChan:        fmt.Printf("I got a request: %v\n", req)    case <-doneChan:        fmt.Printf("serveDatabase: Got closing signal. Stop serving.\n")        return    }}如果调用函数发送到第一个通道两次,然后发送到第二个通道,一切正常:requestChan <- Db_request{ request: "Login", beehive: "yaylaswiese" }requestChan <- Db_request{ request: "Signup", beehive: "aziz nezir" }fmt.Printf("Sending true to the doneChannel\n")doneChan <- true控制台输出(正确)是:>     Waiting for select statement ...>     I got a request: {Login yaylaswiese}>     Waiting for select statement ...>     Sending true to the doneChannel>     I got a request: {Signup aziz nezir}>     Waiting for select statement ...>     serveDatabase: Got closing signal. Stop serving.但是,如果我评论第二个请求,例如requestChan <- Db_request{ request: "Login", beehive: "yaylaswiese" }// requestChan <- Db_request{ request: "Signup", beehive: "aziz nezir" }fmt.Printf("Sending true to the doneChannel\n")doneChan <- true然后输出是>     Waiting for select statement ...>     I got a request: {Login yaylaswiese}>     Waiting for select statement ...>     Sending true to the doneChannel所以doneChan 永远不会收到。我也尝试在发送 doneChan 后进入无限循环,但结果相同。那可能是什么?
查看完整描述

1 回答

?
慕无忌1623718

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

最有可能的main是,您在另一个 goroutine 完成之前就退出了。请注意,它们是并发的,一旦main完成,所有其他 goroutine 都会被杀死。

您需要显式地将 goroutine 的结尾与main您可以使用 sync.WaitGroup或其他频道。


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

添加回答

举报

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