Метод time.Timer.Stop

Метод time.Timer.Stop предотвращает срабатывание таймера, если событие еще не произошло. Он возвращает true, если таймер был остановлен до момента срабатывания, и false, если событие уже произошло или таймер уже был остановлен. Этот метод полезен для отмены запланированных операций, когда необходимо освободить ресурсы или предотвратить нежелательные действия.

Синтаксис

gotimer.Stop()

Пример 1: остановка таймера до срабатывания

В этом примере мы останавливаем таймер до того, как он успеет сработать:

gopackage main

import (
  "fmt"
  "time"
)

func main() {
  timer := time.NewTimer(5 * time.Second)

  // Останавливаем таймер до срабатывания
  stopped := timer.Stop()
  fmt.Println("Timer stopped:", stopped)
}

Результат выполнения кода:

go"Timer stopped: true"

Метод вернул true, так как таймер был успешно остановлен до того, как истекло время.

Пример 2: остановка таймера после срабатывания

Если попытаться остановить таймер после того, как он уже сработал, метод вернет false:

gopackage main

import (
  "fmt"
  "time"
)

func main() {
  timer := time.NewTimer(1 * time.Second)

  // Ждем, пока таймер сработает
  <-timer.C

  // Пытаемся остановить уже сработавший таймер
  stopped := timer.Stop()
  fmt.Println("Timer stopped:", stopped)
}

Результат выполнения кода:

go"Timer stopped: false"

Метод вернул false, так как таймер уже сработал, и его остановка невозможна.

Пример 3: использование stop для очистки канала

При остановке таймера важно правильно обрабатывать канал, чтобы избежать утечек памяти или блокировок:

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

Результат выполнения кода:

go"Timer stopped and channel cleaned"

В этом примере мы останавливаем таймер через секунду после запуска и очищаем канал от возможного сообщения, чтобы не допустить нежелательного срабатывания.

Пример 4: повторная остановка таймера

Повторный вызов Stop для уже остановленного таймера всегда возвращает false:

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

Результат выполнения кода:

go"First stop: true"
"Second stop: false"

Первый вызов вернул true, так как таймер был активен, а второй вызов вернул false, потому что таймер уже был остановлен.

Смотрите также

  • метод time.Timer.Reset,
    который изменяет время срабатывания таймера
  • функцию time.NewTimer,
    которая создает новый таймер
  • функцию time.After,
    которая возвращает канал для ожидания
  • функцию time.AfterFunc,
    которая запускает функцию после задержки