Метод time.Timer.Stop
Метод time.Timer.Stop предотвращает срабатывание таймера,
если событие еще не произошло. Он возвращает true,
если таймер был остановлен до момента срабатывания,
и false, если событие уже произошло или таймер уже был остановлен.
Этот метод полезен для отмены запланированных операций,
когда необходимо освободить ресурсы или предотвратить нежелательные действия.
Синтаксис
timer.Stop()
Пример 1: остановка таймера до срабатывания
В этом примере мы останавливаем таймер до того, как он успеет сработать:
package main
import (
"fmt"
"time"
)
func main() {
timer := time.NewTimer(5 * time.Second)
// Останавливаем таймер до срабатывания
stopped := timer.Stop()
fmt.Println("Timer stopped:", stopped)
}
Результат выполнения кода:
"Timer stopped: true"
Метод вернул true, так как таймер был успешно остановлен
до того, как истекло время.
Пример 2: остановка таймера после срабатывания
Если попытаться остановить таймер после того,
как он уже сработал, метод вернет false:
package main
import (
"fmt"
"time"
)
func main() {
timer := time.NewTimer(1 * time.Second)
// Ждем, пока таймер сработает
<-timer.C
// Пытаемся остановить уже сработавший таймер
stopped := timer.Stop()
fmt.Println("Timer stopped:", stopped)
}
Результат выполнения кода:
"Timer stopped: false"
Метод вернул false, так как таймер уже сработал,
и его остановка невозможна.
Пример 3: использование stop для очистки канала
При остановке таймера важно правильно обрабатывать канал, чтобы избежать утечек памяти или блокировок:
package main
import (
"fmt"
"time"
)
func main() {
timer := time.NewTimer(3 * time.Second)
go func() {
<-timer.C
fmt.Println("Timer fired")
}()
time.Sleep(1 * time.Second)
if timer.Stop() {
// Очищаем канал от возможного сообщения
select {
case <-timer.C:
default:
}
fmt.Println("Timer stopped and channel cleaned")
} else {
fmt.Println("Timer already fired")
}
}
Результат выполнения кода:
"Timer stopped and channel cleaned"
В этом примере мы останавливаем таймер через секунду после запуска и очищаем канал от возможного сообщения, чтобы не допустить нежелательного срабатывания.
Пример 4: повторная остановка таймера
Повторный вызов Stop для уже остановленного таймера
всегда возвращает false:
package main
import (
"fmt"
"time"
)
func main() {
timer := time.NewTimer(5 * time.Second)
// Первая остановка
stopped1 := timer.Stop()
fmt.Println("First stop:", stopped1)
// Вторая остановка
stopped2 := timer.Stop()
fmt.Println("Second stop:", stopped2)
}
Результат выполнения кода:
"First stop: true"
"Second stop: false"
Первый вызов вернул true, так как таймер был активен,
а второй вызов вернул false, потому что таймер
уже был остановлен.
Смотрите также
-
метод
time.Timer.Reset,
который изменяет время срабатывания таймера -
функцию
time.NewTimer,
которая создает новый таймер -
функцию
time.After,
которая возвращает канал для ожидания -
функцию
time.AfterFunc,
которая запускает функцию после задержки