Тип time.Timer
Тип time.Timer представляет собой таймер, который срабатывает один раз
через заданный интервал времени. Он создается с помощью функции
time.NewTimer, которая принимает длительность типа
time.Duration и возвращает указатель на time.Timer.
Когда таймер срабатывает, он отправляет текущее время в канал
C, который доступен для чтения. Таймер можно остановить
до срабатывания с помощью метода Stop или сбросить на новый
интервал с помощью метода Reset.
Создание таймера
Для создания таймера используется функция time.NewTimer.
Она принимает один параметр - длительность, через которую
таймер должен сработать:
package main
import (
"fmt"
"time"
)
func main() {
timer := time.NewTimer(2 * time.Second)
fmt.Println("Timer started")
<-timer.C
fmt.Println("Timer fired")
}
Результат выполнения кода:
"Timer started"
"Timer fired"
В этом примере таймер создается на 2 секунды, после чего программа
блокируется на чтении из канала timer.C до тех пор, пока
таймер не сработает.
Остановка таймера
Метод Stop позволяет остановить таймер до того, как он
сработает. Он возвращает true, если таймер был остановлен
успешно (не сработал), и false, если таймер уже сработал
или был остановлен ранее:
package main
import (
"fmt"
"time"
)
func main() {
timer := time.NewTimer(5 * time.Second)
stopped := timer.Stop()
if stopped {
fmt.Println("Timer stopped successfully")
} else {
fmt.Println("Timer already fired")
}
}
Результат выполнения кода:
"Timer stopped successfully"
В этом примере таймер останавливается до срабатывания, поэтому
метод возвращает true.
Сброс таймера
Метод Reset останавливает таймер и устанавливает новый
интервал. Он полезен, когда нужно изменить время срабатывания
уже существующего таймера. Метод возвращает true, если
таймер был активен до сброса:
package main
import (
"fmt"
"time"
)
func main() {
timer := time.NewTimer(1 * time.Second)
time.Sleep(500 * time.Millisecond)
reset := timer.Reset(3 * time.Second)
if reset {
fmt.Println("Timer was active, reset to 3 seconds")
} else {
fmt.Println("Timer was already expired")
}
<-timer.C
fmt.Println("Timer fired after reset")
}
Результат выполнения кода:
"Timer was active, reset to 3 seconds"
"Timer fired after reset"
В этом примере таймер сбрасывается на 3 секунды до того, как исходный интервал в 1 секунду истек, поэтому он срабатывает через 3 секунды после сброса.
Использование с select
Таймер часто используется в конструкции select для
реализации таймаутов. Это позволяет ожидать несколько событий
одновременно:
package main
import (
"fmt"
"time"
)
func main() {
ch := make(chan string)
go func() {
time.Sleep(2 * time.Second)
ch <- "Hello"
}()
timer := time.NewTimer(1 * time.Second)
select {
case msg := <-ch:
fmt.Println("Received:", msg)
case <-timer.C:
fmt.Println("Timeout: 1 second passed")
}
}
Результат выполнения кода:
"Timeout: 1 second passed"
В этом примере таймер срабатывает через 1 секунду, и блок
select выбирает этот случай, поскольку канал ch
получает значение только через 2 секунды.
Смотрите также
-
функцию
time.NewTimer,
которая создает новый таймер -
метод
time.Timer.Stop,
который останавливает таймер -
метод
time.Timer.Reset,
который сбрасывает таймер на новый интервал -
тип
time.Ticker,
который представляет периодический таймер