time
更新: 5/25/2025 字数: 0 字 时长: 0 分钟
源码链接:time.go - Go
Time的结构体代码如下:
go
type Time struct {
wall uint64
ext int64
loc *Location
}Timer:
go
type Timer struct {
C <-chan Time
initTimer bool
}```
Ticker:
```go
type Ticker struct {
C <-chan Time
// The channel on which the ticks are delivered.
initTicker bool
}常用类型和函数
func Now() Time:当前时间func (t Time) Add(d Duration) Time:返回 t + dfunc (t Time) After(u Time) bool:判断t是否在u之后func (t Time) Before(u Time) bool:判断t是否在u之前type Duration int64:时间间隔类型func Since(t Time) Duration:现在距离t过了多久func NewTimer(d Duration) *Timer:创建一个计时器,本质上是一个缓冲区为1的channelfunc (t *Timer) Stop() bool:用defer t.Stop()func AfterFunc(d Duration, f func()) *Timer:在过了d时间后,创建一个goroutine执行f,返回一个Timer用来取消goroutinefunc NewTicker(d Duration) *Ticker:创建一个定时器,本质上是一个缓冲区为1的channel,每隔d时间向通道发送当前时间func (t *Ticker) Stop():用defer t.Stop()func After(d duration) <- chan Time:一般用在超时处理
go
func main(){
select {
case m := <-c:
handle(m)
case <-time.After(10 * time.Second):
fmt.Println("timed out")
}
}func Sleep(d Duration):time.Sleep()函数的内部实现基于Go语言的调度器。调度器负责管理goroutines的执行,确保它们按照预定的顺序执行。以下是time.Sleep()函数的工作原理:- 调度器将当前goroutine的状态设置为
waiting,并从运行队列中移除。 - 当前goroutine将不再占用系统资源,直到暂停时间结束。
- 经过指定的暂停时间后,调度器将当前goroutine的状态设置为
runnable,并重新将其加入运行队列。 - 当前goroutine将继续执行,直到它再次进入
waiting状态或程序结束。
这种设计使得
time.Sleep()函数非常高效,因为它不会创建新的goroutine或线程,而是简单地让当前goroutine在指定时间内不占用系统资源。- 调度器将当前goroutine的状态设置为
