2017-01-25 13 views
0

私はゴーにチャンネルをアンダーラインしようとしています。簡単なコードゴランのタイマーの仕組み

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() 
} 

私はこの

0 second 
1 second 
2 second 
EXIT: 3 seconds 

のようなコンソール結果を期待する。しかし実際には、この

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

のように私はこのタイマーで何をしないのですされ、どのように私は修正することができますがあります問題?

答えて

3

これはforループのためです。ループの各円RightHandSide case <-time.After(3 * time.Second):selectの文が評価され、新しいタイマーを与えます。たとえば、このようにすれば正常に動作するはずです

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") 
    } 
}