Thanks Sam for the reply.

If I get you correctly then the entire loop will run for 1 second right
because after 1second then time.After will return the current time on the
channel and the function will return.

On Sep 23, 2016 7:43 PM, "Sam Whited" <s...@samwhited.com> wrote:

On Fri, Sep 23, 2016 at 6:24 AM, DM <subharaj.ma...@gmail.com> wrote:
> So a timer is started for 1 second. Before 1 second is over let's say
boring writes something to channel c then case s := <- c will be executed.
The moment somthing is written on channel c the timer that was started gets
garbage collected and therefore it never returns the current time on the
channel after 1 second?
>
>     for {
>         select {
>         case s := <-c:
>             fmt.Println(s)
>         case <-time.After(1 * time.Second):
>             fmt.Println("You're too slow.")
>             return
>         }
>     }

I think there's some confusion here about how the select statement
works; when you receive something from c in this channel, it is
printed, and then the loop starts over and we wait on input again. If
both c and the channel returned by time.After have nothing to receive,
we put the current goroutine to sleep. When *either* one of them
receives some data (eg. you've sent something else to c, or the timer
has expired and sent on the channel returned by time.After), that case
is selected and executed. If both c and the channel returned by
time.After have something, a case is selected randomly. The time.After
channel isn't garbage collected until after the function returns (when
it goes out of scope). Since we're in an infinite loop, this only
happens after the time.After channel is selected and the return is
hit.

The main thing to remember is that select puts the goroutine to sleep
until any of its case statements unblock (data is available to read
from the channel, in this case). When one or more of the case
staetments unblock it picks one at random and executes it, then moves
on (which in this case means trying again because it's in an infinite
loop).

—Sam


--
Sam Whited
pub 4096R/54083AE104EA7AD3

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