亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

GoLang context包的使用方法介紹

 更新時間:2023年03月15日 08:31:51   作者:水淹萌龍  
日常Go開發(fā)中,Context包是用的最多的一個了,幾乎所有函數(shù)的第一個參數(shù)都是ctx,那么我們?yōu)槭裁匆獋鬟fContext呢,Context又有哪些用法,底層實現(xiàn)是如何呢?相信你也一定會有探索的欲望,那么就跟著本篇文章,一起來學(xué)習(xí)吧

背景

在父子協(xié)程協(xié)作過程中, 父協(xié)程需要給子協(xié)程傳遞信息, 子協(xié)程依據(jù)父協(xié)程傳遞的信息來決定自己的操作.

這種需求下可以使用 context 包

簡介

Context通常被稱為上下文,在go中,上層的協(xié)程可以將context 傳給下層的協(xié)程, 來實現(xiàn)協(xié)程之間的信息傳遞, 同時下層協(xié)程也可以將context 傳給更下層的協(xié)程, 來形成一張樹狀圖.

主要方法

獲得頂級上下文

首先要獲得最頂級協(xié)程使用的Context

func Background() Context

Background 方法一般創(chuàng)建根 Context 的時候。

func TODO() Context

TODO 方法,當不清楚使用哪個上下文時,可以使用 TODO 方法。

當前協(xié)程上下文的操作

針對 Context 可以執(zhí)行如下操作.

Deadline() (deadline time.Time, ok bool)

Deadline 方法返回結(jié)果有兩個,第一個是截止時間,到了這個截止時間,Context 會自動取消;第二個是一個 bool 類型的值,如果 Context 沒有設(shè)置截止時間,第二個返回結(jié)果是 false,如果需要取消這個 Context,就需要調(diào)用取消函數(shù)。

Done() <-chan struct{}

Done 方法返回一個只讀的 channel 對象,類型是 struct{},在 goroutine 中,如果 Done 方法返回的結(jié)果可以被讀取,代表父 Context 調(diào)用了取消函數(shù)。

Err() error

Err 方法返回 Context 被取消的原因。

Value(key interface{}) interface{}

Value 方法返回此 Context 綁定的值。它是一個 kv 鍵值對,通過 key 獲取對應(yīng) value 的值

創(chuàng)建下級協(xié)程的Context

我們要依據(jù)父級的協(xié)程的Context創(chuàng)建子級協(xié)程的Context

WithCancel(parent Context) (ctx Context, cancel CancelFunc)

WithCancel 方法,基于父 Context,接收一個父 Context 參數(shù),生成一個新的子 Context,和一個 cancel 函數(shù),用于取消 Context。

WithDeadline(parent Context, d time.Time) (Context, CancelFunc)

WithDeadline 方法,基于父 Context,接收一個父 Context 參數(shù),和一個截止時間的參數(shù),生成一個新的子 Context,和一個 cancel 函數(shù),可以使用 cancel 函數(shù)取消 Context,也可以等到截止時間,自動取消 Context。

WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc)

WithTimeout 方法,基于父 Context,接收一個父 Context 參數(shù),和一個超時時間的參數(shù),生成一個新的子 Context,和一個 cancel 函數(shù),可以使用 cancel 函數(shù)取消 Context,也可以等到超時時間,自動取消 Context。

WithValue(parent Context, key, val interface{}) Context

WithValue 方法,基于父 Context,生成一個新的子 Context,攜帶了一個 kv 鍵值對,一般用于傳遞上下文信息。

場景示例

公司下班, 要領(lǐng)導(dǎo)下班后, 員工才下班, 但是員工忍耐也是有限度的, 領(lǐng)導(dǎo)老是不下班, 員工就自己走了.

package main
import (
	"context"
	"fmt"
	"time"
)
var name string
func main() {
	// 頂級Conxt, 領(lǐng)導(dǎo)
	up_context := context.Background()
	// 創(chuàng)建領(lǐng)導(dǎo)的下級 員工的的Context, 員工就最多加班5秒, 超過5秒領(lǐng)導(dǎo)不下班. 員工就下班了
	ctx, cancle := context.WithTimeout(up_context, time.Second*5)
	go work(ctx, "小卡拉")
	// 父線程等待3秒, 領(lǐng)導(dǎo)加班3秒
	time.Sleep(time.Second * 3)
	fmt.Println(time.Now().Format("2006-01-02 15:04:05"), "領(lǐng)導(dǎo)下班了!")
	// 領(lǐng)導(dǎo)下班調(diào)用cancle(), 取消員工的 Context
	cancle()
	time.Sleep(time.Second * 5)
}
func work(ctx context.Context, name string) {
	for {
		select {
		// 看看員工的 Context 還在不在
		case <-ctx.Done():
			fmt.Println(time.Now().Format("2006-01-02 15:04:05"), name, "下班!")
			return
		default:
			fmt.Println(time.Now().Format("2006-01-02 15:04:05"), name, "加班!。")
			time.Sleep(time.Second * 1)
		}
	}
}

上面的代碼中up_context 是最頂級的 Context 是使用context.Background()創(chuàng)建出來的, 員工的 Context對象 ctx 則是使用最頂級的up_context 并且使用WithTimeout方法創(chuàng)建出來的, 表示如果5秒內(nèi)不調(diào)用返回的 cancel 方法, 就會自動取消, 對應(yīng)員工最多等待領(lǐng)導(dǎo)五秒. 上面的執(zhí)行結(jié)果是:

可以看到, 領(lǐng)導(dǎo)就加班了3秒, 領(lǐng)導(dǎo)一下班, 員工就下班了.

如果領(lǐng)導(dǎo)加班7秒呢, 代碼改成如下

package main
import (
	"context"
	"fmt"
	"time"
)
var name string
func main() {
	// 頂級Conxt, 領(lǐng)導(dǎo)
	up_context := context.Background()
	// 創(chuàng)建領(lǐng)導(dǎo)的下級 員工的的Context, 員工就最多加班5秒, 超過5秒領(lǐng)導(dǎo)不下班. 員工就下班了
	ctx, cancle := context.WithTimeout(up_context, time.Second*5)
	go work(ctx, "小卡拉")
	// 父線程等待7秒, 領(lǐng)導(dǎo)加班7秒
	time.Sleep(time.Second * 7)
	fmt.Println(time.Now().Format("2006-01-02 15:04:05"), "領(lǐng)導(dǎo)下班了!")
	// 領(lǐng)導(dǎo)下班調(diào)用cancle(), 取消員工的 Context
	cancle()
	time.Sleep(time.Second * 5)
}
func work(ctx context.Context, name string) {
	for {
		select {
		// 看看員工的 Context 還在不在
		case <-ctx.Done():
			fmt.Println(time.Now().Format("2006-01-02 15:04:05"), name, "下班!")
			return
		default:
			fmt.Println(time.Now().Format("2006-01-02 15:04:05"), name, "加班!。")
			time.Sleep(time.Second * 1)
		}
	}
}

執(zhí)行結(jié)果如下

可以看到, 領(lǐng)導(dǎo)加班7秒, 員工并沒有等著領(lǐng)導(dǎo)下班, 在第五秒的時候自己下班了.

到此這篇關(guān)于GoLang context包的使用方法介紹的文章就介紹到這了,更多相關(guān)Go context內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • GO語言實現(xiàn)批量壓縮圖片和水印

    GO語言實現(xiàn)批量壓縮圖片和水印

    這篇文章主要介紹了GO語言實現(xiàn)批量壓縮圖片和水印,主要用到了github.com/nfnt/resize這個第三方庫,僅僅支持JPG圖片格式,有相同需求的小伙伴參考下吧。
    2015-03-03
  • Go語言實現(xiàn)讀取文件的方式總結(jié)

    Go語言實現(xiàn)讀取文件的方式總結(jié)

    這篇文章主要為大家詳細介紹了Go語言實現(xiàn)讀取文件的幾個方式,文中的示例代碼講解詳細,對我們學(xué)習(xí)Go語言有一定的幫助,感興趣的小伙伴可以收藏一下
    2023-04-04
  • Go語言開發(fā)框架反射機制及常見函數(shù)示例詳解

    Go語言開發(fā)框架反射機制及常見函數(shù)示例詳解

    這篇文章主要為大家介紹了Go語言開發(fā)框架反射機制及常見函數(shù)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • 減少 golang 二進制文件大小操作

    減少 golang 二進制文件大小操作

    這篇文章主要介紹了減少 golang 二進制文件大小操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Go 循環(huán)結(jié)構(gòu)for循環(huán)使用教程全面講解

    Go 循環(huán)結(jié)構(gòu)for循環(huán)使用教程全面講解

    這篇文章主要為大家介紹了Go 循環(huán)結(jié)構(gòu)for循環(huán)使用全面講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-10-10
  • 淺析Golang中的內(nèi)存逃逸

    淺析Golang中的內(nèi)存逃逸

    內(nèi)存逃逸分析是go的編譯器在編譯期間,根據(jù)變量的類型和作用域,確定變量是堆上還是棧上。本文將通過示例淺析一下Golang中的內(nèi)存逃逸,需要的可以了解一下
    2022-10-10
  • golang xorm及time.Time自定義解決json日期格式的問題

    golang xorm及time.Time自定義解決json日期格式的問題

    這篇文章主要介紹了golang xorm及time.Time自定義解決json日期格式的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • golang gorm 操作mysql及gorm基本用法

    golang gorm 操作mysql及gorm基本用法

    golang 官方的那個操作mysql的有點麻煩所以就使用了gorm,下面就gorm的使用做下簡單介紹,感興趣的朋友跟隨小編一起看看吧
    2018-11-11
  • go for range遍歷二維數(shù)組的示例

    go for range遍歷二維數(shù)組的示例

    今天小編就為大家分享一篇關(guān)于go for range遍歷二維數(shù)組的示例,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • Golang語言如何高效拼接字符串詳解

    Golang語言如何高效拼接字符串詳解

    最近在做性能優(yōu)化,有個函數(shù)里面的耗時特別長,看里面的操作大多是一些字符串拼接的操作,而字符串拼接在 golang 里面其實有很多種實現(xiàn),下面這篇文章主要給大家介紹了關(guān)于Golang語言如何高效拼接字符串的相關(guān)資料,需要的朋友可以參考下
    2021-11-11

最新評論