» Go语言快速入门 » 3. 高级篇 » 3.3 时间

时间

time 包提供了测量和显示时间的功能。

Time

Time 表示具有纳秒精度的时间点。

package main

import (
	"fmt"
	"time"
)

func main() {
	// 获取当前时间
	currentTime := time.Now()

	// 格式化并显示时间
	fmt.Println("Current Time:", currentTime.Format("2006-01-02 15:04:05"))

    t := time.Date(2009, time.November, 10, 23, 0, 0, 0, time.UTC)
	fmt.Printf("Go launched at %s\n", t.Local())
}

纪元

程序中的一个常见需求是获取自Unix 纪元(1970年1月1日 UTC 00:00:00)以来的秒数、毫秒数或纳秒数。

package main

import (
	"fmt"
	"time"
)

func main() {
	currentTime := time.Now()
	epochTime := currentTime.Unix()
	fmt.Println("Current Epoch Time:", epochTime)
}

超时

在 Go 中,time.After 函数可用于创建一个通道,在指定的持续时间之后发送当前时间。通常用于实现超时。

package main

import (
	"fmt"
	"time"
)

func main() {
	timeoutDuration := 3 * time.Second

	// 创建一个通道,该通道将在指定的一段时间后接收当前时间
	timeoutChan := time.After(timeoutDuration)

	fmt.Println("Start operation...")

	time.Sleep(2 * time.Second)

	select {
	case <-timeoutChan:
		fmt.Println("Operation timed out!")
	case <-time.After(time.Second):
		fmt.Println("Operation completed successfully.")
	}
}

定时器

time 包提供了 Timer 类型,可用于在指定的时间后执行操作。

package main

import (
	"fmt"
	"time"
)

func main() {
	timeoutDuration := 3 * time.Second

	// 创建一个将在指定的持续时间后触发的定时器
	timer := time.NewTimer(timeoutDuration)

	fmt.Println("Start operation...")

	time.Sleep(2 * time.Second)

	// 等待定时器触发
	<-timer.C

	fmt.Println("Operation timed out!")
}

当你只是想要一个在一段持续时间后发送信号的通道,使用 time.After。 当你需要更多控制,比如在计时器触发之前停止计时器,使用 time.Timer

周期性定时器

Ticker 类型可用于在周期性时间间隔执行操作。

package main

import (
	"fmt"
	"time"
)

func main() {
	// 创建一个每秒钟触发一次的 Ticker
	ticker := time.NewTicker(1 * time.Second)

	fmt.Println("Start operation...")

	for i := 0; i < 5; i++ {
		<-ticker.C

		// 在每个滴答时执行操作
		fmt.Println("Tick", i)
	}

	ticker.Stop()

	fmt.Println("Operation completed successfully.")
}
// => Start operation...
// Tick 0
// Tick 1
// Tick 2
// Tick 3
// Tick 4
// Operation completed successfully.

速率限制

速率限制是一种控制资源利用速率和保持服务质量的重要机制。

Go 提供了 golang.org/x/time/rate 包用于实现速率限制。 或者,开发者可以选择手动使用 time.Ticker 来实现速率限制。

package main

import (
    "fmt"
    "time"
)

func main() {

    requests := make(chan int, 5)
    for i := 1; i <= 5; i++ {
        requests <- i
    }
    close(requests)

    limiter := time.Tick(200 * time.Millisecond)

    for req := range requests {
        <-limiter
        fmt.Println("request", req, time.Now())
    }
}
// => 
// request 1 2013-10-07 16:41:15.236641687 +0000 UTC m=+0.200585747
// request 2 2013-10-07 16:41:15.436968762 +0000 UTC m=+0.400912897
// request 3 2013-10-07 16:41:15.636203458 +0000 UTC m=+0.600147531
// request 4 2013-10-07 16:41:15.836366439 +0000 UTC m=+0.800310502
// request 5 2013-10-07 16:41:16.036687838 +0000 UTC m=+1.000631919

代码挑战

写一个周期性间隔执行任务的程序。

Loading...
> 此处输出代码运行结果
上页
下页