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.