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.