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

GoLang context包的使用方法介紹

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

背景

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

這種需求下可以使用 context 包

簡(jiǎn)介

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

主要方法

獲得頂級(jí)上下文

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

func Background() Context

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

func TODO() Context

TODO 方法,當(dāng)不清楚使用哪個(gè)上下文時(shí),可以使用 TODO 方法。

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

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

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

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

Done() <-chan struct{}

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

Err() error

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

Value(key interface{}) interface{}

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

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

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

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

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

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

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

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

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

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

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

場(chǎng)景示例

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

package main
import (
	"context"
	"fmt"
	"time"
)
var name string
func main() {
	// 頂級(jí)Conxt, 領(lǐng)導(dǎo)
	up_context := context.Background()
	// 創(chuàng)建領(lǐng)導(dǎo)的下級(jí) 員工的的Context, 員工就最多加班5秒, 超過(guò)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 是最頂級(jí)的 Context 是使用context.Background()創(chuàng)建出來(lái)的, 員工的 Context對(duì)象 ctx 則是使用最頂級(jí)的up_context 并且使用WithTimeout方法創(chuàng)建出來(lái)的, 表示如果5秒內(nèi)不調(diào)用返回的 cancel 方法, 就會(huì)自動(dòng)取消, 對(duì)應(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() {
	// 頂級(jí)Conxt, 領(lǐng)導(dǎo)
	up_context := context.Background()
	// 創(chuàng)建領(lǐng)導(dǎo)的下級(jí) 員工的的Context, 員工就最多加班5秒, 超過(guò)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秒, 員工并沒(méi)有等著領(lǐng)導(dǎo)下班, 在第五秒的時(shí)候自己下班了.

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

相關(guān)文章

  • golang將多路復(fù)異步io轉(zhuǎn)成阻塞io的方法詳解

    golang將多路復(fù)異步io轉(zhuǎn)成阻塞io的方法詳解

    常見(jiàn)的IO模型有阻塞、非阻塞、IO多路復(fù)用,異,下面這篇文章主要給大家介紹了關(guān)于golang將多路復(fù)異步io轉(zhuǎn)成阻塞io的方法,文中給出了詳細(xì)的示例代碼,需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-09-09
  • Go數(shù)組的具體使用

    Go數(shù)組的具體使用

    Go語(yǔ)言中的數(shù)組是一種固定長(zhǎng)度的數(shù)據(jù)結(jié)構(gòu),它包含一組按順序排列的元素,每個(gè)元素都具有相同的類型,本文主要介紹了Go數(shù)組的具體使用,包括聲明數(shù)組、初始化數(shù)組、訪問(wèn)數(shù)組元素等,感興趣的可以了解下
    2023-11-11
  • Go實(shí)現(xiàn)分布式唯一ID的生成之雪花算法

    Go實(shí)現(xiàn)分布式唯一ID的生成之雪花算法

    本文主要介紹了Go實(shí)現(xiàn)分布式唯一ID的生成之雪花算法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • Gin與Mysql實(shí)現(xiàn)簡(jiǎn)單Restful風(fēng)格API實(shí)戰(zhàn)示例詳解

    Gin與Mysql實(shí)現(xiàn)簡(jiǎn)單Restful風(fēng)格API實(shí)戰(zhàn)示例詳解

    這篇文章主要為大家介紹了Gin與Mysql實(shí)現(xiàn)簡(jiǎn)單Restful風(fēng)格API示例詳解,有需要的朋友可以借鑒參考下希望能夠有所幫助,祝大家多多進(jìn)步
    2021-11-11
  • 一文詳解go的defer和return的執(zhí)行順序

    一文詳解go的defer和return的執(zhí)行順序

    go的defer和return是golang中的兩個(gè)關(guān)鍵字,return用于返回函數(shù)的返回值,也可以參與一定的流程控制,defer是golang中的延遲調(diào)用,經(jīng)常用于文件流的關(guān)閉,鎖的解鎖操作,本文給大家介紹了go的defer和return的執(zhí)行順序,需要的朋友可以參考下
    2024-07-07
  • 圖解Golang的GC垃圾回收算法

    圖解Golang的GC垃圾回收算法

    這篇文章主要介紹了圖解Golang的GC垃圾回收算法,詳細(xì)的介紹了三種經(jīng)典的算法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-03-03
  • Golang截取字符串方法示例講解及對(duì)比

    Golang截取字符串方法示例講解及對(duì)比

    這篇文章主要介紹了Golang截取字符串方法,文中介紹了使用rune函數(shù)和utf包以及range遍歷的方式,熟練掌握這些可以幫助我們更方便地處理字符串,提高編程效率和代碼質(zhì)量,感興趣的同學(xué)可以參考下文
    2023-05-05
  • Go語(yǔ)言基本的語(yǔ)法和內(nèi)置數(shù)據(jù)類型初探

    Go語(yǔ)言基本的語(yǔ)法和內(nèi)置數(shù)據(jù)類型初探

    這篇文章主要介紹了Go語(yǔ)言基本的語(yǔ)法和內(nèi)置數(shù)據(jù)類型,是golang入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-10-10
  • 使用go實(shí)現(xiàn)常見(jiàn)的數(shù)據(jù)結(jié)構(gòu)

    使用go實(shí)現(xiàn)常見(jiàn)的數(shù)據(jù)結(jié)構(gòu)

    這篇文章主要介紹了使用go實(shí)現(xiàn)常見(jiàn)的數(shù)據(jù)結(jié)構(gòu),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • Go語(yǔ)言中重構(gòu)的技巧分享

    Go語(yǔ)言中重構(gòu)的技巧分享

    這篇文章主要來(lái)和大家分享一下Go語(yǔ)言中重構(gòu)的技巧,即如何盡量避免使用 else、break 和 continue,從而讓代碼更透明、更易讀,感興趣的小伙伴可以學(xué)習(xí)一下
    2023-10-10

最新評(píng)論

罗甸县| SHOW| 观塘区| 鸡东县| 新干县| 祁东县| 岳阳市| 邵阳县| 吉水县| 苏尼特右旗| 安顺市| 禄丰县| 灵宝市| 南川市| 德安县| 上高县| 灯塔市| 定结县| 东方市| 当涂县| 中宁县| 乳山市| 昌平区| 沅陵县| 安泽县| 合阳县| 洪泽县| 宕昌县| 文登市| 普兰县| 苏尼特右旗| 都江堰市| 舟山市| 商洛市| 嘉荫县| 红河县| 张家港市| 仁怀市| 维西| 安图县| 广安市|