Goタイマと断続器


1、タイマー
Go言語では、タイマは、特定のイベントを所定の時点で実行することができ、タイマの実質は一方向チャネル、timeである.Timer構造体のタイプにはtimeがある.Timeタイプの一方向chanは、以下のように具体的に宣言されています.
type Timer struct {
    C <-chan Time
    r runtimeTimer
}

初期化は2つの方法でのみ行うことができる:time.NewTimer()とtime.AfterFunc()は、次のコードを参照してください.
package main

import (
    "fmt"
    "time"
)

func main() {
    // NewTimer         d        d    ,     ;    *Timer  ,            *Timer C(chan time.Time)   
    t := time.NewTimer(2 * time.Second)
    now := time.Now()
    fmt.Printf("Now time: %v
", now)     //  goroutine, t.C     expire := <-t.C     fmt.Printf("Expire time: %v
", expire) }
package main

import (
    "fmt"
    "time"
)

func main() {
    var t *time.Timer
    f := func() {
        fmt.Printf("Expriation time: %v
", time.Now())         fmt.Printf("C`s length: %v
", len(t.C))     }     //      t = time.AfterFunc(1*time.Second, f)     //      time.Sleep(2 * time.Second) }

タイマのStop()メソッドとReset()メソッドを使用しない場合は、タイマのショートカットメソッドをそのまま使用できます.次のようになります.
package main

import (
    "fmt"
    "time"
)

func main() {
    fmt.Printf("Now time:%v
", time.Now())     c := <-time.After(5 * time.Second)     fmt.Printf("TimeOut. Now :%v
", c) }

タイマが期限切れになる前にStop()を使用すると、エレメントがチャネル内に書き込まれなくなり、チャネルエレメントが存在するgoroutineを受け入れるのを待つだけでブロックされ、停止したタイマを復元する唯一の方法はReset()メソッドを使用してリセットすることである.タイマを多重化することができ、特にforサイクルで多重化することで、プログラムのリソース占有量を低減することができ、この場合、Reset()メソッドがタイマをリセットする必要がある.
2、断続器
Goは、あるタスクを複数回実行するツールを提供し、実質的に一方向チャネル、time.構造体タイプにはtimeがある.Timeタイプの一方向chanは、以下のように具体的に宣言されています.
type Ticker struct {
    C <-chan Time 
    r runtimeTimer
}

次のコードを使用して、次のようにして、新しいTicker()を使用して割り込みを初期化します.
package main

import (
    "fmt"
    "time"
)

func main() {
    ticks := time.NewTicker(30 * time.Second)
    tick := ticks.C
    go func() {
        // for...range...           
        for _ = range tick {
            fmt.Printf("%vExecute the task.
", time.Now())             //  , , ,             _, ok := <-tick             if !ok {                 break             }         }     }()     fmt.Printf("Now: %v.
", time.Now())     time.Sleep(5 * time.Minute)     fmt.Println("Done.") }

遮断器のStop()メソッドを使用しない場合は、次のように遮断器のショートカットメソッドを直接使用できます.
tick := <-time.Tick(5 * time.Second)