查看 gobyexample.com 的示例:https://gobyexample.com/timers
timer2 := time.NewTimer(time.Second)
go func() {
<-timer2.C
fmt.Println("Timer 2 fired")
}()
stop2 := timer2.Stop()
if stop2 {
fmt.Println("Timer 2 stopped")
}
问题:停止后计时器会go func()
永远卡住吗?如果是,处理这种情况的正确方法是什么?
如果计时器在触发之前停止,goroutine 将继续等待。您必须使用另一个通道或上下文来停止它:
是的。
您可以保留原样的代码;只要不会导致死锁或泄漏,goroutine 无限期阻塞也是可以的。
如果您希望 goroutine 继续,请参阅Burak Serdar 的答案。如果您希望函数在计时器到期后(但不在停止后)执行某些操作,请使用AfterFunc。
请注意,Go 1.23 中有一个最近的修复。从time.Timer.Stop ...
并从time.Timer.NewTimer ...