2016-01-27 3 views
5

Warum nicht diesen Golong-Code zwischen mehreren Zeit auswählen.Nach Kanälen arbeiten?Warum wählt dieser Golang-Code nicht zwischen mehreren Zeitpunkten aus.Nach Kanälen funktionieren?

Siehe Code unten. Die Nachricht 'Timeout' wird nie ausgegeben. Warum?

package main 

import (
    "fmt" 
    "time" 
) 

func main() { 
    count := 0 
    for { 
     select { 
     case <-time.After(1 * time.Second): 
      count++ 
      fmt.Printf("tick %d\n", count) 
      if count >= 5 { 
       fmt.Printf("ugh\n") 
       return 
      } 
     case <-time.After(3 * time.Second): 
      fmt.Printf("timeout\n") 
      return 
     } 
    } 
} 

Run auf Spielplatz: http://play.golang.org/p/1gku-CWVAh

Ausgang:

tick 1 
tick 2 
tick 3 
tick 4 
tick 5 
ugh 
+0

Mögliche Duplikat [golang Timeouts ist mit Kanälen nicht ausgeführt] (http://stackoverflow.com/questions/34894927/golang-timeouts-is-not-executed-with-channels) – icza

Antwort

10

Da time.After eine Funktion ist, so bei jeder Iteration es einen neuen Kanal zurückgibt. Wenn Sie diesen Kanal wollen das gleiche für alle Iterationen sein, sollten Sie es vor der Schleife sparen:

timeout := time.After(3 * time.Second) 
for { 
    select { 
    //... 
    case <-timeout: 
     fmt.Printf("timeout\n") 
     return 
    } 
} 

Spielplatz: http://play.golang.org/p/muWLgTxpNf.

+0

Great! Ich habe mehrere Kanäle erstellt! Vielen Dank! – Everton

3

Sogar @Ainar-G hat bereits die Antwort zur Verfügung gestellt, eine andere Möglichkeit ist es, time.Tick(1e9) zu verwenden, um eine Zeit Tick auf jeder Sekunde zu generieren und dann nach timeAfter Kanal nach dem angegebenen Zeitraum zu hören.

package main 

import (
    "fmt" 
    "time" 
) 

func main() { 
    count := 0 
    timeTick := time.Tick(1 * time.Second) 
    timeAfter := time.After(5 * time.Second) 

    for { 
     select { 
     case <-timeTick: 
      count++ 
      fmt.Printf("tick %d\n", count) 
      if count >= 5 { 
       fmt.Printf("ugh\n") 
       return 
      } 
     case <-timeAfter: 
      fmt.Printf("timeout\n") 
      return 
     } 
    } 
} 
Verwandte Themen