The select already received in that case and is waiting to send, but the select has to be re-entered for the next receive to happen.
Matt On Wednesday, February 7, 2018 at 9:22:31 AM UTC-6, Damon Zhao wrote: > > I know wrap with a goroutine can fix it. I just wonder why must use an > extra goroutine? > > 在 2018年2月7日星期三 UTC+8下午11:00:25,matthe...@gmail.com写道: >> >> Desynchronizing "case idle <- <-source:" fixes it: >> >> case v := <-source: >> go func () { idle <- v }() >> >> I added a counter to break after a number of loops since it goes >> infinitely: https://play.golang.org/p/aZbmTKvpxcD >> >> Matt >> >> On Wednesday, February 7, 2018 at 8:38:41 AM UTC-6, Damon Zhao wrote: >>> >>> Please answer these questions before submitting your issue. Thanks! >>> What version of Go are you using (go version)? >>> >>> go version go1.9.3 darwin/amd64 >>> Does this issue reproduce with the latest release? >>> >>> yes >>> What operating system and processor architecture are you using (go env)? >>> GOARCH="amd64" >>> GOBIN="" >>> GOEXE="" >>> GOHOSTARCH="amd64" >>> GOHOSTOS="darwin" >>> GOOS="darwin" >>> GOPATH="/Users/ariesdevil/Dropbox/workspace/go_workspace" >>> GORACE="" >>> GOROOT="/usr/local/Cellar/go/1.9.3/libexec" >>> GOTOOLDIR="/usr/local/Cellar/go/1.9.3/libexec/pkg/tool/darwin_amd64" >>> GCCGO="gccgo" >>> CC="clang" >>> GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics >>> -Qunused-arguments -fmessage-length=0 >>> -fdebug-prefix-map=/var/folders/h2/xl15t9g94tgfwclshzl086bh0000gp/T/go-build125147941=/tmp/go-build >>> >>> -gno-record-gcc-switches -fno-common" >>> CXX="clang++" >>> CGO_ENABLED="1" >>> CGO_CFLAGS="-g -O2" >>> CGO_CPPFLAGS="" >>> CGO_CXXFLAGS="-g -O2" >>> CGO_FFLAGS="-g -O2" >>> CGO_LDFLAGS="-g -O2" >>> PKG_CONFIG="pkg-config" >>> >>> What did you do? >>> >>> code1: play.golang.org/p/8rcO11QS8un (@ianlancetaylor answerd at >>> https://github.com/golang/go/issues/23728#issuecomment-363771924) >>> >>> >>> code2: https://play.golang.org/p/fJXhK8w22uu >>> >>> Above code2 sometimes run perfect and sometimes deadlock on my machine. >>> >>> >>> <https://lh3.googleusercontent.com/-j-2Sg_4wENk/WnsPXZktt7I/AAAAAAAAb9M/vI8Ci9g8k9gZ_83XWS6qgR2bxjuHN8w1ACLcBGAs/s1600/%25E5%25B1%258F%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7%2B2018-02-07%2B22.10.22.png> >>> >>> >>> >>> But if I put it in a goroutine, the result is confused: >>> >>> >>> https://play.golang.org/p/oUmMr8TM2sz success >>> >>> https://play.golang.org/p/54eLI7x5FwD failed >>> >>> >>> notice line 25 when I use >>> >>> ``` >>> >>> case worker := <-source: >>> >>> idle <- worker >>> >>> ``` >>> >>> instead of: >>> >>> ``` >>> >>> case idle <- <-source: >>> >>> ``` >>> >>> it works. >>> What did you expect to see? >>> >>> I think it should not deadlock. >>> What did you see instead? >>> deadlock sometimes. >>> >>> >>> -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.