package main
import (
"log"
"time"
)
func main() {
log.
Println("start program") defer
log.
Println("end program")
closed := make(chan struct{})
msg := make(chan int)
for i := 0; i < 10; i++ {
go listen(closed, msg, i)
}
for i := 0; i < 30; i++ {
// <-time.After(time.Second)
msg <- i
}
close(closed)
}
func listen(closed chan struct{}, msg chan int, id int) {
log.
Println("start listen", id
) defer
log.
Println("end listen", id
)
for {
select {
case <-closed:
return
case x := <-msg:
log.
Println(id
, "get msg!", x
) }
}
}
cGFja2FnZSBtYWluCgppbXBvcnQgKAoJImxvZyIKCSJ0aW1lIgopCgpmdW5jIG1haW4oKSB7Cglsb2cuUHJpbnRsbigic3RhcnQgcHJvZ3JhbSIpCglkZWZlciBsb2cuUHJpbnRsbigiZW5kIHByb2dyYW0iKQoKCWNsb3NlZCA6PSBtYWtlKGNoYW4gc3RydWN0e30pCgltc2cgOj0gbWFrZShjaGFuIGludCkKCglmb3IgaSA6PSAwOyBpIDwgMTA7IGkrKyB7CgkJZ28gbGlzdGVuKGNsb3NlZCwgbXNnLCBpKQoJfQoKCWZvciBpIDo9IDA7IGkgPCAzMDsgaSsrIHsKCQkvLyA8LXRpbWUuQWZ0ZXIodGltZS5TZWNvbmQpCgkJbXNnIDwtIGkKCX0KCgljbG9zZShjbG9zZWQpCgoJPC10aW1lLkFmdGVyKDUgKiB0aW1lLlNlY29uZCkKfQoKZnVuYyBsaXN0ZW4oY2xvc2VkIGNoYW4gc3RydWN0e30sIG1zZyBjaGFuIGludCwgaWQgaW50KSB7Cglsb2cuUHJpbnRsbigic3RhcnQgbGlzdGVuIiwgaWQpCglkZWZlciBsb2cuUHJpbnRsbigiZW5kIGxpc3RlbiIsIGlkKQoKCWZvciB7CgkJc2VsZWN0IHsKCQljYXNlIDwtY2xvc2VkOgoJCQlyZXR1cm4KCQljYXNlIHggOj0gPC1tc2c6CgkJCWxvZy5QcmludGxuKGlkLCAiZ2V0IG1zZyEiLCB4KQoJCX0KCX0KfQo=