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

golang:select语句中的通道仅接收有时(???),select,go,channel,Select,Go,Channel,我在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 cl

我在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
因此,多尼坎号从未收到过。我也试图在发送doneChan后进入一个无休止的循环,但结果是一样的


这可能是什么?

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


您需要显式地将goroutines的结尾与
main
同步,或者另一个通道。

此外,要考虑到如果requestChan和doneChan都有数据,选择may pick doneChan first,for循环将在从requestChan读取所有数据之前退出。顺便说一句,在Go游乐场中提供您的问题的有效示例有助于集中讨论,并得到回答者的赞赏。:)
>     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