Golang: Почему я также получаю сообщение с канала после остановки таймера

первый код (ненормальный):

var ti time.Timer
func init() {
    ti = *time.NewTimer(3 * time.Second)
}
func main() {
    ti.Stop()
    t := <-ti.C
    fmt.Println("End", t) 
}

второй код (обычный):

var ti *time.Timer
func init() {
    ti = time.NewTimer(3 * time.Second)
}
func main() {
    ti.Stop()
    t := <-ti.C
    fmt.Println("End", t) // deadlock!
}

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

И второй код нормальный, он отличается от "var ti time.Timer" и "var ti *time.Timer", один из которых является значением, а другой - указателем.

Я не знаком с указателем, может кто-нибудь мне помочь?

Спасибо!

Это должно ответить на ваш вопрос: stackoverflow.com/questions/50521386/…

Levi 19.02.2023 08:05
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
2
1
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы разыменовываете тикер, и его значение копируется.

Вот метод остановки:

func (t *Ticker) Stop() {
    stopTimer(&t.r)
}

Когда вы скопировали таймер, &t.r указывает куда-то еще. Вот почему ваш таймер не останавливается.

Поэтому вы должны использовать *time.Ticker, а не time.Ticker.

Другие вопросы по теме