Why don't i get a Timer message on my channel

Not sure why the below does not exit after 2 seconds. It just keeps receiving integers forever.

package main

import (
	"fmt"
  "time"
)

func main() {
	c := make(chan int)
	go emit(c)
	for i := range c {
    fmt.Printf("%d\n", i)
  }
}

func emit(c chan int) {
  defer close(c)

	for i := 0; ; i++ {
    select {
    case <-time.After(2 * time.Second):
      return;
    default:
      c <- i
    }
	}
}

You need to define your timer channel outside of the for loop.

func emit(c chan int) {
	defer close(c)

	tchan := time.After(2*time.Second)
	defer close(tchan)

	for i := 0; ; i++ {
		select {
		case <-tchan:
			return
		default:
			c <- i
			time.Sleep(400 * time.Millisecond)
		}
	}
}

Thanks @mictrez

This topic was automatically closed 90 days after the last reply. New replies are no longer allowed.