91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

GoLang?context包如何使用

發布時間:2023-03-15 09:54:45 來源:億速云 閱讀:140 作者:iii 欄目:開發技術

本文小編為大家詳細介紹“GoLang context包如何使用”,內容詳細,步驟清晰,細節處理妥當,希望這篇“GoLang context包如何使用”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。

背景

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

這種需求下可以使用 context 包

簡介

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

主要方法

獲得頂級上下文

首先要獲得最頂級協程使用的Context

func Background() Context

Background 方法一般創建根 Context 的時候。

func TODO() Context

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

當前協程上下文的操作

針對 Context 可以執行如下操作.

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

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

Done() <-chan struct{}

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

Err() error

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

Value(key interface{}) interface{}

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

創建下級協程的Context

我們要依據父級的協程的Context創建子級協程的Context

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

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

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

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

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

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

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

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

場景示例

公司下班, 要領導下班后, 員工才下班, 但是員工忍耐也是有限度的, 領導老是不下班, 員工就自己走了.

package main
import (
	"context"
	"fmt"
	"time"
)
var name string
func main() {
	// 頂級Conxt, 領導
	up_context := context.Background()
	// 創建領導的下級 員工的的Context, 員工就最多加班5秒, 超過5秒領導不下班. 員工就下班了
	ctx, cancle := context.WithTimeout(up_context, time.Second*5)
	go work(ctx, "小卡拉")
	// 父線程等待3秒, 領導加班3秒
	time.Sleep(time.Second * 3)
	fmt.Println(time.Now().Format("2006-01-02 15:04:05"), "領導下班了!")
	// 領導下班調用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()創建出來的, 員工的 Context對象 ctx 則是使用最頂級的up_context 并且使用WithTimeout方法創建出來的, 表示如果5秒內不調用返回的 cancel 方法, 就會自動取消, 對應員工最多等待領導五秒. 上面的執行結果是:

GoLang?context包如何使用

可以看到, 領導就加班了3秒, 領導一下班, 員工就下班了.

如果領導加班7秒呢, 代碼改成如下

package main
import (
	"context"
	"fmt"
	"time"
)
var name string
func main() {
	// 頂級Conxt, 領導
	up_context := context.Background()
	// 創建領導的下級 員工的的Context, 員工就最多加班5秒, 超過5秒領導不下班. 員工就下班了
	ctx, cancle := context.WithTimeout(up_context, time.Second*5)
	go work(ctx, "小卡拉")
	// 父線程等待7秒, 領導加班7秒
	time.Sleep(time.Second * 7)
	fmt.Println(time.Now().Format("2006-01-02 15:04:05"), "領導下班了!")
	// 領導下班調用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)
		}
	}
}

執行結果如下

GoLang?context包如何使用

可以看到, 領導加班7秒, 員工并沒有等著領導下班, 在第五秒的時候自己下班了.

讀到這里,這篇“GoLang context包如何使用”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

衡南县| 洛阳市| 长岭县| 唐海县| 扬州市| 通化县| 财经| 梓潼县| 武汉市| 海盐县| 石台县| 油尖旺区| 安龙县| 天台县| 昌宁县| 北票市| 息烽县| 清苑县| 天峨县| 边坝县| 沁水县| 永济市| 睢宁县| 宜都市| 济宁市| 夏邑县| 咸宁市| 丹寨县| 扶绥县| 济阳县| 莆田市| 唐山市| 东光县| 柳江县| 牡丹江市| 望江县| 太湖县| 伊吾县| 揭东县| 武邑县| 郓城县|