In diesem Kapitel werden wir uns mit der Verwendung von Timern und Ticker beschäftigen, um zeitgesteuerte Aufgaben in Go zu handhaben. Diese Mechanismen sind sehr nützlich, wenn es darum geht, bestimmte Aktionen zu verzögern oder in regelmäßigen Abständen auszuführen.
Ein Timer in Go ist ein Mechanismus, der nach einer bestimmten
Zeitdauer ein Ereignis auslöst. Timer sind Teil des
time-Pakets.
Hier ein einfaches Beispiel für die Verwendung eines Timers:
package main
import (
"fmt"
"time"
)
func main() {
timer := time.NewTimer(2 * time.Second)
fmt.Println("Timer started")
<-timer.C
fmt.Println("Timer expired")
}In diesem Beispiel:
time.NewTimer(2 * time.Second) aufrufen.timer.C lauschen, was ein Channel ist, der ein Signal
sendet, wenn der Timer abläuft.Ein Timer kann auch zurückgesetzt oder gestoppt werden:
package main
import (
"fmt"
"time"
)
func main() {
timer := time.NewTimer(5 * time.Second)
go func() {
time.Sleep(2 * time.Second)
if timer.Stop() {
fmt.Println("Timer stopped")
}
}()
fmt.Println("Waiting for timer...")
<-timer.C
fmt.Println("Timer expired")
}In diesem Beispiel:
timer.C nie ein Signal
senden.Ein Ticker in Go ist ein Mechanismus, der in regelmäßigen Abständen
ein Ereignis auslöst. Ticker sind ebenfalls Teil des
time-Pakets.
Hier ein einfaches Beispiel für die Verwendung eines Tickers:
package main
import (
"fmt"
"time"
)
func main() {
ticker := time.NewTicker(1 * time.Second)
done := make(chan bool)
go func() {
time.Sleep(5 * time.Second)
ticker.Stop()
done <- true
}()
for {
select {
case <-done:
fmt.Println("Ticker stopped")
return
case t := <-ticker.C:
fmt.Println("Tick at", t)
}
}
}In diesem Beispiel:
time.NewTicker(1 * time.Second) aufrufen.done-Channel, um anzuzeigen, dass der Ticker gestoppt
wurde.select-Statement,
um entweder auf das Stoppsignal (done) oder das
Ticker-Signal (ticker.C) zu warten.Manchmal ist es nützlich, Timer und Ticker zusammen zu verwenden. Hier ein Beispiel:
package main
import (
"fmt"
"time"
)
func main() {
ticker := time.NewTicker(1 * time.Second)
timer := time.NewTimer(5 * time.Second)
for {
select {
case t := <-ticker.C:
fmt.Println("Tick at", t)
case <-timer.C:
fmt.Println("Timer expired, stopping ticker")
ticker.Stop()
return
}
}
}In diesem Beispiel:
select-Statement,
um entweder auf das Ticker-Signal oder das Timer-Signal zu warten.