This is a program where the receiver is asking the sender to close after 
receiving 1 value.  Using default for the sending (line 34) causes the code 
to deadlock while even a timeout of a nanosecond causes it to be ok.  
I don't want to time the sending though.  Is there a better option to 
sequence this code?
Is using default not an option here at all?

https://play.golang.org/p/30sI9RYJ1Ed

package main

import "fmt"
//import "time"

var c = make(chan string)
var quit = make(chan bool)

func main() {
go fn()

for {
select {
case msg, ok := <-c:
if !ok {
c = nil
return
} else {
fmt.Println("received: ", msg)
quit <- true
}
}
}
}

func fn() {
for {
select {
case <-quit:
fmt.Println("closin chan c")
close(c)
return
//case <-time.After(time.Nanosecond):  // this is ok
default:                               // using default causes deadlock
c <- "Image"
}
}
}



received:  Imagefatal error: all goroutines are asleep - deadlock!

goroutine 1 [chan send]:
main.main()
        /tmp/sandbox497027958/main.go:20 +0x100

goroutine 5 [chan send]:
main.fn()
        /tmp/sandbox497027958/main.go:35 +0x40
created by main.main
        /tmp/sandbox497027958/main.go:10 +0x40



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