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

I have a select statement in a go routine that receives from two channels.

for {
    fmt.Printf("Waiting for select statement ...
")
    select {
    case req := <-requestChan:
        fmt.Printf("I got a request: %v
", req)
    case <-doneChan:
        fmt.Printf("serveDatabase: Got closing signal. Stop serving.
")
        return
    }
}

If the calling function sends to first channel twice and then to second channel everything works fine:

requestChan <- Db_request{ request: "Login", beehive: "yaylaswiese" }
requestChan <- Db_request{ request: "Signup", beehive: "aziz nezir" }

fmt.Printf("Sending true to the doneChannel
")
doneChan <- true

The console output (correctly) is:

>     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.

However, if I comment the second request like

requestChan <- Db_request{ request: "Login", beehive: "yaylaswiese" }
// requestChan <- Db_request{ request: "Signup", beehive: "aziz nezir" }

fmt.Printf("Sending true to the doneChannel
")
doneChan <- true

Then the output is

>     Waiting for select statement ...
>     I got a request: {Login yaylaswiese}
>     Waiting for select statement ...
>     Sending true to the doneChannel

So the doneChan is never received. I tried also to go into a endless loop after sending doneChan, but it has the same result.

What could that be?

Most likely, your main is exiting before the other goroutine finalised. Note that they're concurrent, and once main finishes, all other goroutines are killed.

You need to explicitly synchronize the end of your goroutines with main. You can use sync.WaitGroup for that, or another channel.