成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Golang中Context包基礎知識詳解

開發 前端
目前Context.Background和Context.TODO方法沒有太大差別,返回的都是空Context,只是在使用場景和語義上稍有不同。其他的Context都需要基于構造好的Context衍生出來,一個Context可以衍生多個子Context。

什么是context.Context?

context.Context是Golang標準庫提供的接口(context包對此接口有多種實現),該接口提供了四個抽象法:

type Context interface {
  Deadline() (deadline time.Time, ok bool)
  Done() <-chan struct{}
  Err() error
  Value(key any) any
}
  • Deadline方法,返回context.Context被取消的時間點,也就是需要完成任務的截止時間,連續調用返回相同的結果。
  • Done方法, 當前context被取消后,返回的channel就會被close。如果當前context不會被取消則返回nil,連續調用返回相同的結果。
  • Err方法,返回context.Context結束的錯誤
  • 如果Done方法返回的channel沒有關閉,返回nil
  • 如果Done方法返回的channel被關閉了,返回一個非nil的值,連續調用返回相同的結果
  • context如果被取消了,返回 “context canceled”錯誤
  • 如果執行時間超過了Deadline,返回 “context deadline exceeded”錯誤
  • Value方法,返回Context中key對應的value值,對于同一個context,多次調用獲取同一個key的值會返回相同的結果。

如何構造context.Context對象?

context包提供了兩個方法:

func Background() Context{}
func TODO() Context {}
  • Background方法,返回一個空Context對象,所有Context對象的的源頭都應該是這個空Context對象。
  • TODO方法,也是返回一個空Context對象,如果還不確定使用何種Context時,可以使用此方法創建的Context對象。

目前context.Background和context.TODO方法沒有太大差別,返回的都是空Context,只是在使用場景和語義上稍有不同。其他的Context都需要基于構造好的Context衍生出來,一個Context可以衍生多個子Context。

衍生Context方法

context包提供如下四個以With開頭的衍生Context的方法:

func WithCancel(parent Context) (ctx Context, cancel CancelFunc)
func WithDeadline(parent Context, d time.Time) (Context, CancelFunc)
func WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc)
func WithValue(parent Context, key, val any) Context

前三種方法的相同點都是基于parent Context生成一個新的Context并返回一個CancelFunc方法,CancelFunc調用后,當前Context和基于新Context的子Context都會被取消。不同點在于WithCancel方法返回的CancelFunc需要手動調用;WithDeadline方法可以設置一個時間點,到這個時間點后會自動調用CancelFunc,當然也可以手動調用;WithTimeout方法可以設置時長,超過指定時長后會自動調用CancelFunc,當然也可以手動調用。

WithValue方法可以生成一個綁定指定的鍵值對數據的Context,可以通過context.Value(Key) 獲取指定key的值。

使用context包需要注意的點

  • 需要Context參數的方法,把Context作為第一個參數(千萬不要把Context放在結構體中,然后將結構體作為參數傳遞)。
  • 使用context.Background方法構造的Context對象應該作為根Context, 用于衍生其他Context。
  • 方法需要傳入的Context類型不確定的時候,傳入使用context.TODO構造的Context (千萬不要傳入nil)。
  • 不要濫用context.WithValue傳遞數據,只用來傳遞必須的數據。
  • Context是并發安全的,同一個Context可以傳遞給多個goroutine,可被多個goroutine同時訪問。
責任編輯:姜華 來源: 今日頭條
相關推薦

2023-11-13 21:55:12

Go編程

2023-05-15 08:50:58

ContextGolang

2009-04-17 14:22:40

XPathXML基礎

2021-11-05 15:31:01

UbuntuLinux

2009-09-14 14:49:12

LINQ查詢基礎知識

2023-08-02 09:07:27

Golangio 包

2010-08-06 08:49:00

2010-11-15 10:02:31

UPS電源技術

2010-07-30 16:38:10

路由器網絡

2009-10-20 09:26:53

綜合布線系統

2010-09-02 14:28:12

路由器存儲器

2023-07-14 15:10:17

PythonAsyncIO庫

2021-05-18 08:00:38

數據包處理Scapy

2010-03-18 15:07:13

Linux操作系統

2013-10-22 15:48:35

2010-07-16 10:53:30

Perl基礎

2009-09-23 11:07:11

Hibernate基礎

2015-06-01 13:35:43

數據中心DCIM

2023-11-27 15:02:37

BytesGolang

2010-03-18 14:52:05

Linux操作系統
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久国| 日本视频在线播放 | 中文字幕影院 | 在线视频中文字幕 | 一区二区三区小视频 | 国产成人在线免费 | 国产精品一区在线 | www.国产一区 | 天堂综合| 国产精品久久久久久久久久了 | 国产精品网址 | 国产线视频精品免费观看视频 | 亚洲最大的黄色网址 | 久久久久91 | 毛片入口| 毛片com | 亚洲精品日韩在线观看 | 99精品国自产在线 | 免费看一区二区三区 | 亚洲欧美综合 | 成人一区二区三区 | 91免费小视频 | 91久久国产综合久久 | 亚洲 欧美 综合 | 看av片网站| 国产欧美在线视频 | 免费一看一级毛片 | 99reav | 国产成人av免费看 | 国产视频第一页 | 亚洲一区二区三区视频 | 国产一区视频在线 | 蜜桃精品噜噜噜成人av | 国产一区久久 | ririsao久久精品一区 | 国产成人精品免费视频 | 超碰在线97国产 | www.久久99| 一级黄色片免费在线观看 | 精品中文在线 | 国产 欧美 日韩 一区 |