最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go語言時(shí)間處理必備技巧全解析

 更新時(shí)間:2023年04月28日 16:54:38   作者:金刀大菜牙  
Golang 的時(shí)間處理是 Golang 編程中的一個(gè)重要方面,它涉及到了時(shí)間類型、時(shí)間格式化、時(shí)間計(jì)算、時(shí)區(qū)處理以及定時(shí)器和超時(shí)機(jī)制等多個(gè)方面。在本文中,我們將從更深入的角度來探討 Golang 的時(shí)間處理

1. 時(shí)間的表示

Go 語言中時(shí)間的表示方式是通過 time.Time 結(jié)構(gòu)體來表示的。time.Time 類型代表了一個(gè)時(shí)刻,它包含了年月日時(shí)分秒和納秒等信息。

我們可以使用 time.Now() 函數(shù)獲取當(dāng)前時(shí)間,或者使用 time.Date() 函數(shù)創(chuàng)建一個(gè)指定的時(shí)間。

以下是一個(gè)簡(jiǎn)單的示例代碼:

package main
?
import (
    "fmt"
    "time"
)
?
func main() {
    // 獲取當(dāng)前時(shí)間
    t1 := time.Now()
    fmt.Println("當(dāng)前時(shí)間:", t1)
?
    // 創(chuàng)建指定時(shí)間
    t2 := time.Date(2023, 4, 28, 10, 0, 0, 0, time.Local)
    fmt.Println("指定時(shí)間:", t2)
}

輸出結(jié)果:

當(dāng)前時(shí)間: 2023-04-28 14:09:41.517139748 +0800 CST m=+0.000011717
指定時(shí)間: 2023-04-28 10:00:00 +0800 CST

我們可以看到,當(dāng)前時(shí)間和指定時(shí)間的格式都是 年-月-日 時(shí):分:秒.納秒 時(shí)區(qū) 的形式。

在Go語言中,還提供了一些常用的時(shí)間常量,如 time.RFC3339time.RFC822 等。這些常量可以用于解析或格式化時(shí)間字符串,如下所示:

package main
?
import (
    "fmt"
    "time"
)
?
func main() {
    // 解析時(shí)間字符串
    t1, _ := time.Parse(time.RFC3339, "2023-04-28T16:12:34Z")
    fmt.Println("解析時(shí)間字符串:", t1)
?
    // 格式化時(shí)間
    t2 := time.Now().Format(time.RFC822)
    fmt.Println("格式化時(shí)間:", t2)
}

輸出結(jié)果:

解析時(shí)間字符串: 2023-04-28 16:12:34 +0000 UTC
格式化時(shí)間: 28 Apr 23 14:10 CST

注意事項(xiàng):

  • time.Time 類型是一個(gè)值類型,不能使用指針來傳遞或比較。
  • Go 語言中的時(shí)間默認(rèn)使用的是 UTC 時(shí)間,如果需要使用本地時(shí)間,可以使用 time.Local 來指定時(shí)區(qū)。

2. 時(shí)間的計(jì)算

在 Go 語言中,時(shí)間的計(jì)算是通過 time.Duration 類型來表示的。time.Duration 類型代表了一段時(shí)間,可以表示一段時(shí)間的長(zhǎng)度,例如 5 分鐘、10 小時(shí)等。

time.Duration 類型可以使用 time.ParseDuration() 函數(shù)從字符串中解析出來,也可以使用 time.Duration 類型的常量來表示,例如 5 * time.Minute 表示 5 分鐘。

以下是一個(gè)簡(jiǎn)單的示例代碼:

package main
?
import (
    "fmt"
    "time"
)
?
func main() {
    // 計(jì)算時(shí)間差
    t1 := time.Now()
    time.Sleep(3 * time.Second)
    t2 := time.Now()
    d := t2.Sub(t1)
    fmt.Println("時(shí)間差:", d)
?
    // 時(shí)間加減
    t3 := time.Now().Add(10 * time.Minute)
    fmt.Println("當(dāng)前時(shí)間加10分鐘:", t3)
}

輸出結(jié)果:

時(shí)間差: 3.001366444s
當(dāng)前時(shí)間加10分鐘: 2023-04-28 14:23:36.470921569 +0800 CST m=+603.001549491

注意事項(xiàng):

  • time.Duration 類型的值可以是正數(shù)、負(fù)數(shù)或零,可以進(jìn)行加減運(yùn)算。
  • time.Time 類型的 Add() 方法可以用于時(shí)間的加法運(yùn)算,可以接收一個(gè) time.Duration 類型的參數(shù),也可以使用負(fù)數(shù)表示時(shí)間的減法運(yùn)算。

3. 時(shí)間的比較

在 Go 語言中,可以使用 time.Before()、time.After() 和 time.Equal() 等方法來比較兩個(gè)時(shí)間的先后順序以及是否相等。

以下是一個(gè)簡(jiǎn)單的示例代碼:

package main
?
import (
    "fmt"
    "time"
)
?
func main() {
    // 時(shí)間比較
    t1 := time.Date(2022, 9, 1, 10, 0, 0, 0, time.Local)
    t2 := time.Date(2023, 4, 28, 16, 12, 34, 567890123, time.Local)
    if t1.Before(t2) {
        fmt.Println("t1 在 t2 之前")
    }
    if t1.After(t2) {
        fmt.Println("t1 在 t2 之后")
    }
    if t1.Equal(t2) {
        fmt.Println("t1 和 t2 相等")
    } else {
        fmt.Println("t1 和 t2 不相等")
    }
}

輸出結(jié)果:

t1 在 t2 之前
t1 和 t2 不相等

注意事項(xiàng):

  • time.Time 類型可以直接使用 <、> 和 == 等操作符進(jìn)行比較,也可以使用 Before()、After() 和 Equal() 等方法來比較。
  • 在比較兩個(gè)時(shí)間是否相等時(shí),盡量使用 Equal() 方法,而不是直接使用 == 操作符,因?yàn)?time.Time 類型是一個(gè)結(jié)構(gòu)體類型,使用 == 操作符比較的是結(jié)構(gòu)體的內(nèi)存地址,而不是結(jié)構(gòu)體的內(nèi)容。

4. 定時(shí)器和 Ticker

Go 語言中的 time 包提供了定時(shí)器和 Ticker 兩種定時(shí)功能,可以用于實(shí)現(xiàn)延遲執(zhí)行、定期執(zhí)行等功能。

package main
?
import (
    "fmt"
    "time"
)
?
func main() {
    // 創(chuàng)建一個(gè)定時(shí)器,在 3 秒后觸發(fā)任務(wù)
    timer := time.After(3 * time.Second)
    fmt.Println("定時(shí)器已創(chuàng)建,等待觸發(fā)...")
?
    // 等待定時(shí)器觸發(fā)
    <-timer
    fmt.Println("定時(shí)器觸發(fā),任務(wù)開始執(zhí)行...")
}

輸出結(jié)果:

定時(shí)器已創(chuàng)建,等待觸發(fā)...
定時(shí)器觸發(fā),任務(wù)開始執(zhí)行...

Ticker 是在指定的時(shí)間間隔內(nèi)重復(fù)執(zhí)行任務(wù),可以使用 time.NewTicker() 函數(shù)來創(chuàng)建一個(gè) Ticker,例如:

package main
?
import (
    "fmt"
    "time"
)
?
func main() {
    // 創(chuàng)建一個(gè) Ticker,每 1 秒觸發(fā)一次任務(wù)
    ticker := time.NewTicker(1 * time.Second)
    fmt.Println("Ticker 已創(chuàng)建,等待觸發(fā)...")
?
    // 等待 Ticker 觸發(fā)
    for range ticker.C {
        fmt.Println("Ticker 觸發(fā),任務(wù)開始執(zhí)行...")
    }
}

輸出結(jié)果:

Ticker 已創(chuàng)建,等待觸發(fā)...
Ticker 觸發(fā),任務(wù)開始執(zhí)行...
Ticker 觸發(fā),任務(wù)開始執(zhí)行...
Ticker 觸發(fā),任務(wù)開始執(zhí)行...
...

注意事項(xiàng):

  • 在使用定時(shí)器和 Ticker 時(shí),要確保任務(wù)的執(zhí)行時(shí)間不要超過定時(shí)器的時(shí)間間隔,否則可能會(huì)出現(xiàn)任務(wù)重疊的情況。
  • 在使用 Ticker 時(shí),要記得在任務(wù)執(zhí)行完畢后將 ticker.C 的下一個(gè)事件取出,以免任務(wù)執(zhí)行時(shí)間過長(zhǎng)導(dǎo)致事件堆積。

5. 時(shí)區(qū)和時(shí)間格式化

在 Go 語言中,可以使用 time.LoadLocation() 函數(shù)來加載時(shí)區(qū)信息,以便將本地時(shí)間轉(zhuǎn)換為指定時(shí)區(qū)的時(shí)間。同時(shí),還可以使用 time.Parse() 函數(shù)來將字符串解析成時(shí)間對(duì)象,并使用 time.Format() 函數(shù)將時(shí)間對(duì)象格式化成指定格式的字符串。

以下是一個(gè)簡(jiǎn)單的示例代碼:

package main
?
import (
    "fmt"
    "time"
)
?
func main() {
    // 加載時(shí)區(qū)信息
    loc, err := time.LoadLocation("Asia/Shanghai")
    if err != nil {
        fmt.Println("加載時(shí)區(qū)信息失?。?, err)
        return
    }
?
    // 轉(zhuǎn)換本地時(shí)間為指定時(shí)區(qū)時(shí)間
    t := time.Now().In(loc)
    fmt.Println("當(dāng)前時(shí)間(北京時(shí)區(qū)):", t)
?
    // 解析字符串為時(shí)間對(duì)象
    layout := "2006-01-02 15:04:05"
    str := "2023-04-28 16:12:34"
    t2, err := time.Parse(layout, str)
    if err != nil {
        fmt.Println("解析時(shí)間字符串失?。?, err)
        return
    }
    fmt.Println("解析得到的時(shí)間對(duì)象:", t2)
?
    // 將時(shí)間對(duì)象格式化為字符串
    layout2 := "2006年01月02日 15點(diǎn)04分05秒"
    str2 := t2.Format(layout2)
    fmt.Println("格式化得到的字符串:", str2)
}

輸出結(jié)果:

當(dāng)前時(shí)間(北京時(shí)區(qū)): 2023-04-28 14:24:35.802985096 +0800 CST
解析得到的時(shí)間對(duì)象: 2023-04-28 16:12:34 +0000 UTC
格式化得到的字符串: 2023年04月28日 16點(diǎn)12分34秒

在上面的示例代碼中,我們加載了紐約時(shí)區(qū)的信息,并將當(dāng)前時(shí)間轉(zhuǎn)換為紐約時(shí)區(qū)的時(shí)間。接著,我們使用 time.Parse() 函數(shù)將一個(gè)時(shí)間字符串解析成時(shí)間對(duì)象,再使用 time.Format() 函數(shù)將時(shí)間對(duì)象格式化成指定格式的字符串。

需要注意的是,時(shí)間格式字符串中的格式化符號(hào)必須是固定的,不能隨意指定。常用的格式化符號(hào)如下:

符號(hào)含義示例
2006年份,必須為四位數(shù)2022
01月份,帶前導(dǎo)零01
02日期,帶前導(dǎo)零02
15小時(shí)(24小時(shí)制),不帶前導(dǎo)零15
04分鐘,帶前導(dǎo)零04
05秒鐘,帶前導(dǎo)零05
.000微秒,帶固定小數(shù)點(diǎn)和三位數(shù),取值范圍為[000,999].872
-0700時(shí)區(qū)偏移量,形如 -0700 或 +0300-0400 或 +0800 或 +0000

使用這些格式化符號(hào),我們就可以將時(shí)間對(duì)象格式化成自己想要的字符串。

6. 定時(shí)任務(wù)

在Go語言中,可以使用 time.Ticker 類型的變量和 for range 循環(huán)結(jié)合起來實(shí)現(xiàn)定時(shí)任務(wù)。以下是一個(gè)簡(jiǎn)單的示例代碼:

package main
?
import (
    "fmt"
    "time"
)
?
func main() {
    ticker := time.NewTicker(time.Second)
    done := make(chan bool)
    go func() {
        for {
            select {
            case <-done:
                return
            case t := <-ticker.C:
                fmt.Println("當(dāng)前時(shí)間:", t)
            }
        }
    }()
    time.Sleep(5 * time.Second)
    ticker.Stop()
    done <- true
    fmt.Println("定時(shí)任務(wù)已結(jié)束...")
}

輸出結(jié)果:

當(dāng)前時(shí)間: 2023-04-28 20:15:47.1884869 +0800 CST m=+1.005410901
當(dāng)前時(shí)間: 2023-04-28 20:15:48.1882789 +0800 CST m=+2.005202901
當(dāng)前時(shí)間: 2023-04-28 20:15:49.1876515 +0800 CST m=+3.004575501
當(dāng)前時(shí)間: 2023-04-28 20:15:50.1885815 +0800 CST

上面的示例代碼中,我們首先創(chuàng)建了一個(gè) time.Ticker 類型的變量 ticker,用于每秒鐘向通道 ticker.C 發(fā)送一個(gè)時(shí)間信號(hào)。接著,我們使用 make() 函數(shù)創(chuàng)建了一個(gè)通道 done,用于結(jié)束定時(shí)任務(wù)。

然后,我們使用一個(gè)匿名的 Go 協(xié)程來循環(huán)監(jiān)聽通道 ticker.C 和通道 done,并根據(jù)收到的信號(hào)來執(zhí)行相應(yīng)的操作。在每次收到通道 ticker.C 的信號(hào)時(shí),我們都會(huì)輸出當(dāng)前時(shí)間;而在收到通道 done 的信號(hào)時(shí),我們則直接返回,結(jié)束循環(huán)。

接下來,我們使用 time.Sleep() 函數(shù)來讓程序休眠 5 秒鐘,以便測(cè)試。在休眠結(jié)束后,我們使用 ticker.Stop() 函數(shù)來停止定時(shí)器,再向通道 done 發(fā)送一個(gè)信號(hào),告訴循環(huán)協(xié)程結(jié)束循環(huán)。最后,我們輸出一條消息,表示定時(shí)任務(wù)已經(jīng)結(jié)束。

需要注意的是,定時(shí)任務(wù)在循環(huán)協(xié)程中進(jìn)行,因此需要使用 go 關(guān)鍵字啟動(dòng)一個(gè)協(xié)程來執(zhí)行。另外,如果我們不停止定時(shí)器,循環(huán)協(xié)程將一直運(yùn)行下去,因此需要在適當(dāng)?shù)臅r(shí)候停止定時(shí)器。

7. 總結(jié)

在本文中,我們學(xué)習(xí)了 Go 語言中的時(shí)間處理,主要包括以下 7 個(gè)方面:

  • 時(shí)間類型:Go 語言中的時(shí)間類型有 time.Time 和 time.Duration 兩種。
  • 獲取時(shí)間:可以使用 time.Now() 函數(shù)獲取當(dāng)前時(shí)間,或者使用 time.Parse() 函數(shù)解析時(shí)間字符串。
  • 時(shí)間計(jì)算:可以使用 time.Add() 函數(shù)和 time.Sub() 函數(shù)進(jìn)行時(shí)間加減和時(shí)間差計(jì)算。
  • 時(shí)間比較:可以使用 <、<=、>、>=、==、!= 操作符進(jìn)行時(shí)間比較。
  • 時(shí)間格式化:可以使用 time.Format() 函數(shù)將時(shí)間對(duì)象格式化成指定格式的字符串。
  • 定時(shí)任務(wù):可以使用 time.Ticker 類型的變量和 for range 循環(huán)結(jié)合起來實(shí)現(xiàn)定時(shí)任務(wù)。
  • 時(shí)區(qū)處理:可以使用 time.LoadLocation() 函數(shù)加載指定時(shí)區(qū)的信息,或者使用 time.FixedZone() 函數(shù)創(chuàng)建一個(gè)指定偏移量的時(shí)區(qū)。

通過本文的學(xué)習(xí),希望大家能夠?qū)?Go 語言中的時(shí)間處理有一定的了解。在實(shí)際開發(fā)中,時(shí)間處理是一個(gè)非常常見的需求,因此掌握好時(shí)間處理的方法對(duì)于提高代碼質(zhì)量和開發(fā)效率非常重要。

以上就是Go語言時(shí)間處理必備技巧全解析的詳細(xì)內(nèi)容,更多關(guān)于Go語言時(shí)間處理的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Go語言中工作池的原理與實(shí)現(xiàn)

    Go語言中工作池的原理與實(shí)現(xiàn)

    工作池是一種并發(fā)編程模式,它使用一組固定數(shù)量的工作線程來執(zhí)行任務(wù)隊(duì)列中的工作單元,本文將介紹工作池的工作原理,并通過代碼示例演示其在實(shí)際應(yīng)用中的用途,有需要的可以參考下
    2023-10-10
  • Golang中Json的序列化和反序列化的使用

    Golang中Json的序列化和反序列化的使用

    本文主要介紹了Golang中Json的序列化和反序列化的使用,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • Go語言開發(fā)前后端不分離項(xiàng)目詳解

    Go語言開發(fā)前后端不分離項(xiàng)目詳解

    這篇文章主要為大家介紹了Go語言開發(fā)前后端不分離項(xiàng)目詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • golang通過node_exporter監(jiān)控GPU及cpu頻率、溫度的代碼

    golang通過node_exporter監(jiān)控GPU及cpu頻率、溫度的代碼

    node_exporter這個(gè)開源組件是配合prometheus收集主機(jī)操作系統(tǒng)層的metrics的常用組件,但是官方?jīng)]有提供GPU卡的metrics的采集,今天通過本文給大家介紹golang通過node_exporter監(jiān)控GPU及cpu頻率、溫度的相關(guān)知識(shí),感興趣的朋友一起看看吧
    2022-05-05
  • go語言內(nèi)存泄漏的常見形式

    go語言內(nèi)存泄漏的常見形式

    本文主要介紹了go語言內(nèi)存泄漏的常見形式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-04-04
  • Go?json自定義Unmarshal避免判斷nil示例詳解

    Go?json自定義Unmarshal避免判斷nil示例詳解

    這篇文章主要為大家介紹了Go?json自定義Unmarshal避免判斷nil示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Go并發(fā)編程之死鎖與活鎖的案例分析

    Go并發(fā)編程之死鎖與活鎖的案例分析

    死鎖就是在并發(fā)程序中,兩個(gè)或多個(gè)線程彼此等待對(duì)方完成操作,從而導(dǎo)致它們都被阻塞,并無限期地等待對(duì)方完成;活鎖就是程序一直在運(yùn)行,但是無法取得進(jìn)展。本文將從一些案例出發(fā),分析一下它們,希望對(duì)大家有所幫助
    2023-04-04
  • Golang正則表達(dá)式判斷手機(jī)號(hào)或身份證方法實(shí)例

    Golang正則表達(dá)式判斷手機(jī)號(hào)或身份證方法實(shí)例

    日常使用一些軟件時(shí)會(huì)通過手機(jī)號(hào)碼來注冊(cè),這就會(huì)用到正則表達(dá)式來判斷號(hào)碼是否正確,下面這篇文章主要給大家介紹了關(guān)于Golang正則表達(dá)式判斷手機(jī)號(hào)或身份證的相關(guān)資料,需要的朋友可以參考下
    2022-07-07
  • 淺談Golang 切片(slice)擴(kuò)容機(jī)制的原理

    淺談Golang 切片(slice)擴(kuò)容機(jī)制的原理

    我們知道 Golang 切片在容量不足的情況下會(huì)進(jìn)行擴(kuò)容,擴(kuò)容的原理是怎樣的呢,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • 深入了解Go語言中g(shù)oioc框架的使用

    深入了解Go語言中g(shù)oioc框架的使用

    goioc?是一個(gè)基于?GO?語言編寫的依賴注入框架,基于反射來進(jìn)行編寫。本文主要為大家介紹了goioc框架的原理與使用,需要的可以參考一下
    2022-11-11

最新評(píng)論

滨州市| 封开县| 鹤山市| 齐齐哈尔市| 荥经县| 姜堰市| 长宁区| 郴州市| 西乡县| 定边县| 巴里| 江津市| 上杭县| 天气| 定兴县| 昌黎县| 屯门区| 全椒县| 宁德市| 浮山县| 南丹县| 卢湾区| 丁青县| 宁远县| 云浮市| 齐河县| 建湖县| 黎城县| 益阳市| 乌什县| 株洲县| 巴林左旗| 纳雍县| 舒兰市| 锦州市| 宣武区| 佛坪县| 桃源县| 邮箱| 望都县| 靖西县|