精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Go1.21 速覽:Context 可以設置取消原因和回調函數了,等的可太久了!

開發 前端
Context 一直是大家使用的最頻繁的標準庫之一,他聯通了整個 Go 里的工程體系。這次在 Go1.21 對 Context 增加了 WithXXXCause 相關函數的錯誤類型支持。對于我們在 Go 工程實踐中的排查和定位,能夠有一些不錯的助力。

大家好,我是煎魚。

在 Go 中有一個很經典的設計:context,這是許多同學初學時必學的標準庫。涉及到上下文傳遞、超時控制等必要項。

甚至在函數體中的第一個參數大多是傳 context。寫第三方庫也必須兼容 context 設置,否則會經常有人提需求讓你支持。

我覺得這次的新特性更新雖不復雜,但作用挺大。建議大家學習!

Context Demo

以下是一個快速 Demo:

package main

import (
 "context"
 "fmt"
 "time"
)

const shortDuration = 1 * time.Millisecond

func main() {
 ctx, cancel := context.WithTimeout(context.Background(), shortDuration)
 defer cancel()

 select {
 case <-time.After(1 * time.Second):
  fmt.Println("overslept")
 case <-ctx.Done():
  fmt.Println(ctx.Err())
 }

}

運行結果:

context deadline exceeded

一切都看起來沒什么問題。

麻煩點

但在實際寫業務代碼和排查問題時,你就會發現一個麻煩的事。在出現上下文超時或到達所設置的截止時間時,ctx.Err 方法可以獲得 context deadline exceeded 的錯誤信息。

但這是遠遠不夠的,你只知道是因為誘發了超時。但不知道是哪里導致的,還得再去根據訪問的邏輯,再走一遍腦洞,再進行排查。又或是根據代碼堆棧,再去設想,最后復現成功。

又或是查不到。因為這種一般是偶現,很有可能就留給下一代的繼承者了~

又更有業務訴求,希望在出現上下文的異常場景時,可以及時執行回調方法。然而這沒有太便捷的實現方式。

Go1.21 增強 Context

增加 WithXXXCause

在即將發布的 Go1.21,針對 Context 的錯誤處理終于有了一點點的增強,來填補這個地方的信息,允許添加自定義的錯誤類型和信息。

新增的 Context API 如下:

// WithDeadlineCause behaves like WithDeadline but also sets the cause of the
// returned Context when the deadline is exceeded. The returned CancelFunc does
// not set the cause.
func WithDeadlineCause(parent Context, d time.Time, cause error) (Context, CancelFunc)

// WithTimeoutCause behaves like WithTimeout but also sets the cause of the
// returned Context when the timout expires. The returned CancelFunc does
// not set the cause.
func WithTimeoutCause(parent Context, timeout time.Duration, cause error) (Context, CancelFunc)

與原先的 WithDeadline 和 WithTimeout 作用基本一致,唯一區別就是在形參上增加了 cause error,允許傳入錯誤類型。

WithTimeoutCause

WithTimeoutCause 的使用示例:

tooSlow := fmt.Errorf("too slow!")
ctx, cancel := context.WithTimeoutCause(context.Background(), 1*time.Second, tooSlow)
time.Sleep(2*time.Second)
cancel()

像上述程序,執行 ctx.Err 方法時得到的結果是:context.DeadlineExceeded,這是既有的。

此時,我們再結合在 Go1.20 版本加入的 context.Cause 方法:

func Cause(c Context) error

就能得到對應的錯誤信息,上述的結果對應的是 tooSlow 變量。

WithCancelCause

WithCancelCause 的使用示例,計時器先觸發:

finishedEarly := fmt.Errorf("finished early")
tooSlow := fmt.Errorf("too slow!")
ctx, cancel := context.WithCancelCause(context.Background())
ctx, _ = context.WithTimeoutCause(ctx, 1*time.Second, tooSlow)
time.Sleep(2*time.Second) // timer fires, setting the cause
cancel(finishedEarly) // no effect as ctx has already been canceled

對應的程序結果:

  • ctx.Err():context.DeadlineExceeded 類型。
  • context.Cause(ctx):tooSlow 類型。

先發生上下文取消的使用示例:

finishedEarly := fmt.Errorf("finished early")
tooSlow := fmt.Errorf("too slow!")
ctx, cancel := context.WithCancelCause(context.Background())
ctx, _ = context.WithTimeoutCause(ctx, 1*time.Second, tooSlow)
time.Sleep(500*time.Millisecond) // timer hasn't expired yet
cancel(finishedEarly) // cancels the timer and sets ctx.Err()

對應的程序結果:

  • ctx.Err():context.Canceled 類型。
  • context.Cause(ctx):finishedEarly 類型。

增加 AfterFunc

同樣的,在 Go1.21 也對 Context(上下文)被取消的動作后增加了一些增強。平時當上下文被取消時,我們只能通過啟動 Goroutine 來監視取消行為并做一系列操作。

但這未免繁瑣且增大了我們的編碼和運行成本,因為每次處理都要 goroutine+select+channel 來一套組合拳,才能真正到寫自己業務代碼的地方。

為此新版本增加了注冊函數的功能,將會在上下文被取消時調用。函數簽名如下:

func AfterFunc(ctx Context, f func()) (stop func() bool)

在函數作用上,該函數會在 ctx 完成(取消或超時)后調用所傳入的函數 f。

在運行機制上,它會自己在 goroutine 中調用 f。需要注意的是,即使 ctx 已經完成,調用 AfterFunc 也不會等待 f 返回。

這也是可以套娃的,在 AfterFunc 里再套 AfterFunc。這里用不好也很容易 goroutine 泄露。

基于這個新函數,可以看看以下兩個例子作為使用場景。

1、多 Context 合并取消的例子:

func WithFirstCancel(ctx1, ctx2 context.Context) (context.Context, context.CancelFunc) {
 ctx, cancel := context.WithCancel(ctx1)
 stopf := context.AfterFunc(ctx2, func() {
  cancel()
 })
 return ctx, func() {
  cancel()
  stopf()
 }
}

2、在取消上下文時停止等待 sync.Cond:

func Wait(ctx context.Context, cond *sync.Cond) error {
 stopf := context.AfterFunc(ctx, cond.Broadcast)
 defer stopf()
 cond.Wait()
 return ctx.Err()
}

基本滿足了各種上下文的復雜訴求了。

總結

Context 一直是大家使用的最頻繁的標準庫之一,他聯通了整個 Go 里的工程體系。這次在 Go1.21 對 Context 增加了 WithXXXCause 相關函數的錯誤類型支持。對于我們在 Go 工程實踐中的排查和定位,能夠有一些不錯的助力。

另外 AfterFunc 函數的增加,看起來是個簡單的功能。但是可以解決以往的一些合并取消上下文和串聯處理的復雜場景,是一個不錯的擴展功能。

苛刻些,美中不足的就是,Go 都已經發布 10+ 年了,加的還是有些太晚了。同時針對 Context 也需要有更體系的排查和定位側的補全了。

責任編輯:武曉燕 來源: 腦子進煎魚了
相關推薦

2023-06-07 10:32:57

內置函數clear

2023-06-19 08:49:55

go文件管理

2023-05-05 08:51:18

Go語言泛型

2023-07-05 08:47:24

Go版本團隊

2018-04-09 14:26:06

Go語法實踐

2023-08-09 08:53:50

GoWASI語義

2025-01-14 11:01:38

2012-02-01 10:33:59

Java

2023-08-02 08:46:02

Go版本號規則

2011-06-15 11:05:14

C語言回調函數

2011-10-31 14:04:40

Windows XP

2023-04-18 08:10:10

2025-05-20 08:20:00

GoGo Context上下文

2011-05-20 17:59:06

回調函數

2025-05-06 00:00:08

2023-11-10 16:31:31

2022-04-12 08:30:52

回調函數代碼調試

2011-07-25 14:32:40

Cocoa 框架 函數

2019-11-05 10:03:08

callback回調函數javascript

2011-05-20 17:19:25

回調函數
點贊
收藏

51CTO技術棧公眾號

欧美亚洲三级| 精品久久久久久久| 欧美性猛xxx| 亚洲精品乱码视频| www.久久成人| 亚洲一区激情| 久久资源免费视频| 91精品国产自产| 日韩在线电影| 岛国av一区二区三区| 中日韩在线视频| 亚洲av片在线观看| 狠狠色丁香久久婷婷综| 欧美一级视频一区二区| 日韩精品一区二区亚洲av性色| 国产精品久av福利在线观看| 欧美日韩一级片网站| 成人免费在线视频播放| 成人影视在线播放| 成人性色生活片| 国产日韩av在线播放| 国产成人在线免费观看视频| 欧美gvvideo网站| 日韩精品视频在线免费观看| 天天久久综合网| 日韩电影免费观| 亚洲h在线观看| 最新视频 - x88av| 噜噜噜噜噜在线视频| 国产99精品国产| 国产精品综合网站| 国产免费av一区二区| 天天揉久久久久亚洲精品| 亚洲精选中文字幕| 亚洲视频 中文字幕| 久久国产精品免费一区二区三区| 日韩欧美亚洲成人| 美女扒开大腿让男人桶| 黄网页免费在线观看| 国产亚洲自拍一区| 欧美黑人xxxxx| 亚洲欧美自偷自拍| av不卡免费在线观看| 亚洲自拍偷拍一区| 一级特黄aa大片| 日本大胆欧美人术艺术动态| 欧洲美女免费图片一区| 日本一区二区欧美| 激情视频一区| 欧美激情伊人电影 | 精品无码一区二区三区的天堂| 欧美涩涩网站| 欧美日韩ab片| 欧美日韩一级在线观看| 一区二区三区在线电影| 久久影视电视剧免费网站清宫辞电视 | 亚洲欧美三级伦理| 中国黄色a级片| 亚洲影院天堂中文av色| 日韩高清人体午夜| 免费看黄色aaaaaa 片| 任你躁在线精品免费| 亚洲国内精品在线| 给我免费观看片在线电影的| 欧美大片网址| 日韩精品在线电影| 爱爱免费小视频| 精品高清久久| 丝袜一区二区三区| www欧美com| 欧美黄免费看| 91精品国产乱码久久久久久蜜臀 | 精灵使的剑舞无删减版在线观看| 一区二区三区在线视频观看 | 欧洲av一区| 国产51人人成人人人人爽色哟哟| 日本一区二区三区在线观看| 亚洲日本理论电影| 18+视频在线观看| 亚洲午夜在线视频| 免费高清在线观看免费| 成人在线黄色| 91精品国产高清一区二区三区| 无码人妻丰满熟妇区毛片蜜桃精品| jizzjizzjizz欧美| 亚洲免费一在线| 亚洲色图27p| 国产一区日韩一区| 国产精品18久久久久久麻辣| 国产精品久久久久久久久久久久久久久久久久 | 九九精品视频免费| 在线观看日韩av电影| 国产成人jvid在线播放| 国产成人久久精品77777综合 | 二吊插入一穴一区二区| 欧美精品丝袜久久久中文字幕| 久久黄色一级视频| 羞羞答答一区二区| 日韩视频免费中文字幕| 日韩久久精品视频| 久久国产剧场电影| 精品国产乱码久久久久软件| 日韩黄色影院| 亚洲成人午夜影院| 最近中文字幕一区二区| 极品一区美女高清| 久久精品国产成人精品| 亚洲免费在线视频观看| 国产综合成人久久大片91| 久久爱av电影| 国产一二区在线| 欧美性jizz18性欧美| 三上悠亚av一区二区三区| 成人午夜三级| 久久九九亚洲综合| 亚洲欧美偷拍视频| 成人激情文学综合网| 亚洲欧洲精品一区二区三区波多野1战4 | 久久香蕉网站| 美日韩精品视频免费看| 一级黄色av片| 99久久综合色| 国产精品视频一二三四区| 成人av色网站| 亚洲免费一级电影| 国产性xxxx高清| 国产伦理精品不卡| 亚洲午夜在线观看| 亚洲精品永久免费视频| 欧美一区二区国产| 2014亚洲天堂| 日本网站在线观看一区二区三区| 国产一区在线免费观看| 午夜羞羞小视频在线观看| 欧美亚洲免费在线一区| 草草地址线路①屁屁影院成人| 激情六月综合| 99免费在线观看视频| 免费在线毛片网站| 欧美日韩久久一区二区| 免费看91的网站| 久久狠狠婷婷| 久久精品丝袜高跟鞋| 九色porny丨国产首页在线| 日韩美女视频在线| 九九热最新地址| 久久99热这里只有精品| 亚洲国产成人不卡| 九九久久国产| 色yeye香蕉凹凸一区二区av| 无码一区二区三区| 国产日韩精品视频一区| 久久精品视频91| 精品国产精品久久一区免费式| 日本在线观看天堂男亚洲| 青春有你2免费观看完整版在线播放高清| 亚洲国产日韩精品| av网页在线观看| 亚洲在线视频| 欧美午夜精品久久久久免费视| 性欧美hd调教| 日韩中文字幕免费看| 91一区二区视频| 亚洲精品国产成人久久av盗摄| 天天色天天干天天色| 欧美日韩亚洲三区| 国产精品一区二区三区在线 | 欧美视频13p| 偷拍夫妻性生活| 日本欧美久久久久免费播放网| 西游记1978| avtt久久| 欧美激情亚洲视频| 性xxxfllreexxx少妇| 色综合色综合色综合| 久久午夜精品视频| 国产精品一区二区91| 国产亚洲黄色片| 中文字幕精品影院| 成人精品aaaa网站| 黄色羞羞视频在线观看| 精品一区二区三区电影| 丰满人妻一区二区三区四区| 综合激情成人伊人| 中国极品少妇xxxx| 日韩国产精品久久| 2021国产视频| 亚洲精品一级二级三级| 成人在线观看视频网站| 波多野结依一区| 在线国产精品视频| 精品国产99久久久久久宅男i| 亚洲成在人线免费| 99国产精品无码| 成人免费不卡视频| 欧美日韩亚洲自拍| 亚洲私拍自拍| 亚洲精品tv久久久久久久久| 一区二区三区高清在线观看| 国产精品久久久久久久久久久新郎 | 国产综合在线看| 国产女人在线观看| 欧美va亚洲va在线观看蝴蝶网| 国产一级免费视频| 亚洲欧美激情视频在线观看一区二区三区 | 久久久久久久久久久久久夜| 亚洲精品国产一区二区三区| 亚洲一卡久久| 无颜之月在线看| 欧美日韩一区二区三区视频播放| www.av一区视频| 国产亚洲人成a在线v网站 | 一夜七次郎国产精品亚洲| 国产浮力第一页| 欧美怡红院视频| 国产精品第9页| 一区二区免费视频| 91麻豆精品久久毛片一级| 91麻豆swag| 国产女主播在线播放| 久久99精品视频| 国产女女做受ⅹxx高潮| 亚洲性感美女99在线| 亚洲国产日韩综合一区| 偷拍亚洲精品| 国产有色视频色综合| 日本免费一区二区三区视频| 国产精品视频一| 成人勉费视频| 亚洲 日韩 国产第一| 污视频在线看网站| 久久精品色欧美aⅴ一区二区| 黄网在线免费| 日韩av在线精品| 日本激情一区二区| 精品国产亚洲在线| 亚洲黄色在线播放| 日韩一卡二卡三卡| 99国产揄拍国产精品| 欧美日韩不卡一区| 91在线视频国产| 欧美久久婷婷综合色| 香蕉污视频在线观看| 91国产视频在线观看| 在线免费黄色av| 欧美日韩中文字幕| 美女又爽又黄免费视频| 欧美日韩国产麻豆| 毛片视频网站在线观看| 欧美日韩国产精品一区二区三区四区 | 日韩欧美精品网站| 男人天堂av在线播放| 一本色道久久综合精品竹菊| 99精品人妻国产毛片| 日本韩国欧美三级| 中文字幕无线码一区| 欧美久久一区二区| 国产按摩一区二区三区| 日韩一区二区三区免费看| www.麻豆av| 亚洲国产精品嫩草影院久久| 青草久久伊人| 中文字幕在线日韩 | 亚洲一区电影777| 久久精品国产亚洲av香蕉| 亚洲444eee在线观看| 一级片中文字幕| 在线影院国内精品| 91成人国产综合久久精品| 欧美一区二区三区四区在线观看| av无码精品一区二区三区宅噜噜| 日韩视频免费观看高清完整版 | 久久婷五月综合| 极品少妇xxxx精品少妇偷拍| 免费人成视频在线播放| www.亚洲色图| 国产又黄又粗视频| 亚洲日本va在线观看| 久久精品欧美一区二区| 日韩欧美极品在线观看| 97人妻一区二区精品免费视频| 日韩视频一区二区三区| 欧美日本网站| 久久激情五月丁香伊人| 国产精品69xx| 国产精品白嫩美女在线观看| 国产欧美88| 精品一区在线播放| 久久亚洲精品中文字幕蜜潮电影| 国内自拍中文字幕| 久久激情久久| 亚洲AV成人精品| 国产日产欧产精品推荐色| 免费黄色激情视频| 黑人精品xxx一区| 一个人看的www日本高清视频| 精品国偷自产国产一区| 激情综合闲人网| 久久99精品久久久久久噜噜| av电影一区| 91手机在线播放| 精品国产91久久久久久浪潮蜜月| 男人j进女人j| 久久久综合网| 逼特逼视频在线观看| 欧美国产成人精品| 日本少妇裸体做爰| 56国语精品自产拍在线观看| 欧美色视频免费| 欧美激情伊人电影| 亚洲我射av| 日本精品免费| 亚洲免费黄色| 污免费在线观看| 亚洲国产高清不卡| 欧美一级视频免费观看| 日韩精品一区二区三区蜜臀| 国产在线网站| 欧美一区二区影院| 最新国产精品精品视频| 久久免费视频2| 青青草国产成人av片免费| 国产精品嫩草av| 亚洲一区二区在线免费看| 国产一区二区在线不卡| 一区二区三区久久精品| 欧美男男激情videos| 成人av资源网| 雨宫琴音一区二区三区| 欧美精品久久久久久久久25p| 久久这里都是精品| 国产午夜久久久| 精品日韩一区二区三区| 国产原创精品视频| 成人性生交大片免费观看嘿嘿视频 | 在线免费观看亚洲视频| 欧美精品九九99久久| 免费日本一区二区三区视频| 国产精品video| 九九久久成人| 国产淫片av片久久久久久| 久久影院午夜论| 国产污污视频在线观看| 日韩经典中文字幕| 日韩伦理在线| 久久久av水蜜桃| 久久国产精品久久w女人spa| 中文字幕丰满孑伦无码专区| 色综合久久综合网欧美综合网| 三区在线观看| 秋霞成人午夜鲁丝一区二区三区| 你懂的一区二区三区| 国产a级一级片| 国产欧美精品一区| ,一级淫片a看免费| 久久国产精品偷| 国产精品成人自拍| 成人综合视频在线| 国产人成亚洲第一网站在线播放| 国产精品成人无码| 久久精品久久久久久| 高清日韩中文字幕| 无码播放一区二区三区| 国产女人aaa级久久久级| 亚洲一级av毛片| 欧美伦理91i| 亚洲第一二三区| 天天干天天av| 亚洲制服欧美中文字幕中文字幕| 亚州精品国产精品乱码不99按摩| 日韩av手机在线看| 国产精品久久占久久| 国产视频精品视频| 色婷婷精品久久二区二区蜜臂av | 毛片在线播放网址| 国产精品小说在线| 欧美午夜视频| 亚欧洲乱码视频| 91精品国产色综合久久不卡蜜臀| 欧美黑人猛交的在线视频| 久久精品丝袜高跟鞋| 精品一区中文字幕| 久久国产精品免费看| 丝袜美腿精品国产二区| 91国内精品白嫩初高生| 亚洲国产精品久久久久爰色欲| 欧美经典三级视频一区二区三区| 怡红院av久久久久久久| 欧美成人三级视频网站| 精品亚洲精品| 成人av毛片在线观看| 亚洲成人第一页| 日本成人在线播放| 国产精品果冻传媒潘| 蜜桃一区二区三区在线| 免费无遮挡无码永久在线观看视频 | 欧美一区二区三| www.51色.com| 欧美午夜视频网站| 美足av综合网|