I don't think so.

see https://golang.org/ref/spec#Select_statements

If one or more of the communications can proceed, a single one that can 
proceed is chosen via a uniform pseudo-random selection. Otherwise, if 
there is a default case, that case is chosen.
 
So if the done channel has been sent, the first case will be selected and f 
will not be called anymore.

On Friday, September 2, 2016 at 1:58:04 AM UTC+8, freeformz wrote:
>
> I think you can still deadlock, but I'm not sure if the `default:` case is 
> considered for random selection of a select like other branches are. It 
> would just be less deterministic.
>
> On Thu, Sep 1, 2016 at 10:38 AM Darren Hoo <darre...@gmail.com 
> <javascript:>> wrote:
>
>> Got it, using buffered channel works for me 
>>
>> ints := make(chan int, 1)
>> done := make(chan bool, 1)
>>
>> go func() {
>> for i := 0; i < 100; i++ {
>> ints <- i
>> }
>> close(ints)
>> }()
>>
>> f := func() {
>> j := 0
>> for {
>> i, ok := <-ints
>> if !ok {
>> done <- true
>> return
>> }
>> j++
>>
>> fmt.Println(i)
>>
>> //10 ints for one batch
>> if j == 10 {
>> return
>> }
>> }
>> }
>>
>> exit:
>> for {
>> f()
>>
>> select {
>> case <-done:
>> fmt.Println("Exiting")
>> break exit
>> default:
>> //do nothing just next f()
>> }
>> }
>>
>>
>>
>> On Friday, September 2, 2016 at 1:30:10 AM UTC+8, freeformz wrote:
>>
>>> If you execute it you are told on which lines the deadlock happens...
>>>
>>> fatal error: all goroutines are asleep - deadlock!
>>>
>>> goroutine 1 [chan send]:
>>> main.main.func2()
>>>         /Users/emuller/go/src/github.com/freeformz/tt/main.go:25 +0xce
>>> main.main()
>>>         /Users/emuller/go/src/github.com/freeformz/tt/main.go:37 +0x118
>>> exit status 2
>>>
>>> main.go:25 is the line that says `done <- true`.
>>>
>>> The `done` channel isn't buffered and the first loop through will select 
>>> that path, but there is not another goroutine selecting from done. so f() 
>>> never returns. Deadlock.
>>>
>>> On Thu, Sep 1, 2016 at 10:04 AM Darren Hoo <darre...@gmail.com> wrote:
>>>
>> var wg sync.WaitGroup
>>>>
>>>> ints := make(chan int, 1)
>>>> done := make(chan bool)
>>>>
>>>> go func() {
>>>> for i := 0; i < 3; i++ {
>>>> ints <- i
>>>> }
>>>> close(ints)
>>>> }()
>>>>
>>>> f := func() {
>>>> wg.Add(1)
>>>> defer wg.Done()
>>>>
>>>> for {
>>>> i, ok := <-ints
>>>> if !ok {
>>>> done <- true
>>>> return
>>>> }
>>>> }
>>>> }
>>>>
>>>> exit:
>>>> for {
>>>> select {
>>>> case <-done:
>>>> break exit
>>>> default:
>>>> f()
>>>> }
>>>> }
>>>> wg.Wait()
>>>>
>>>>
>>>>
>>>> -- 
>>>> 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...@googlegroups.com.
>>>
>>>
>>>> For more options, visit https://groups.google.com/d/optout.
>>>>
>>> -- 
>> 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...@googlegroups.com <javascript:>.
>> For more options, visit https://groups.google.com/d/optout.
>>
>

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

Reply via email to