面试题答案
一键面试原理
- 复用Timer:创建Timer会占用一定的系统资源,如定时器相关的内核资源等。频繁创建Timer意味着频繁申请和释放这些资源,增加系统开销。复用Timer可以减少资源的重复申请和释放,提高资源利用率。
- 及时停止Timer:当Timer不再需要时,如果不及时停止,它可能会继续占用资源,甚至在不必要的时候触发,导致逻辑错误。停止Timer能释放与之关联的资源,防止内存泄漏。
代码实践
- 复用Timer:
package main
import (
"fmt"
"time"
)
func main() {
timer := time.NewTimer(time.Second)
for i := 0; i < 5; i++ {
select {
case <-timer.C:
fmt.Println("Timer fired")
default:
// 重新设置定时器
timer.Reset(time.Second)
}
}
timer.Stop()
}
在上述代码中,创建了一个Timer,然后在循环中通过Reset
方法复用这个Timer,而不是每次都创建新的Timer。
- 及时停止Timer:
package main
import (
"fmt"
"time"
)
func main() {
timer := time.NewTimer(time.Second)
go func() {
time.Sleep(2 * time.Second)
if timer.Stop() {
fmt.Println("Timer stopped successfully")
}
}()
select {
case <-timer.C:
fmt.Println("Timer fired")
case <-time.After(3 * time.Second):
fmt.Println("Timeout")
}
}
在此代码中,通过Stop
方法及时停止了Timer,防止其不必要地触发,释放相关资源。