2017-01-25 3 views
0

Ich versuche, Kanäle in Go zu unterlegen. Es gibt einen einfachen CodeWie Timer in Golang funktionieren

package main 

import (
    "fmt" 
    "sync" 
    "time" 
) 

func main() { 
    var wg sync.WaitGroup 
    wg.Add(1) 

    go func() { 
     defer wg.Done() 

     i := 0 

     for { 
      select { 
      case <-time.After(3 * time.Second): 
       fmt.Println("EXIT: 3 seconds") 
       return 
      case <-time.After(1 * time.Second): 
       fmt.Println(i, "second") 
     } 
     i++ 
    } 
}() 

wg.Wait() 
} 

I Konsole Ergebnis erwarten ähnliche

0 second 
1 second 
2 second 
EXIT: 3 seconds 

Aber eigentlich ist es wie dieser

0 second 
1 second 
2 second 
3 second 
4 second 
5 second 
6 second 
... 

ist Was soll ich mit diesem Timer fehlt und wie kann ich das beheben ein Problem?

Antwort

3

Es ist wegen For-Schleife. Jeder Kreis der Schleife RightHandSide von case <-time.After(3 * time.Second): in select Anweisung ausgewertet und geben Sie einen neuen Timer. Zum Beispiel sollten so Dinge funktionieren

stop := time.After(3 * time.Second) 
for { 
    select { 
     case <-stop: 
      fmt.Println("EXIT: 3 seconds") 
      return 
     case <-time.After(1 * time.Second): 
      fmt.Println(i, "second") 
    } 
}