golang:select语句中的通道仅接收有时(???)
我在go例程中有一个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
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