Первый код (ненормальный):
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", один из которых является значением, а другой - указателем.
Я не знаком с указателем, может кто-нибудь мне помочь?
Спасибо!
Вы разыменовываете тикер, и его значение копируется.
Вот метод остановки:
func (t *Ticker) Stop() {
stopTimer(&t.r)
}
Поэтому вы должны использовать *time.Ticker, а не time.Ticker.
Это должно ответить на ваш вопрос: stackoverflow.com/questions/50521386/…