go資深之路筆記(一) Context

一、 Context 的正確使用與底層原理

1.結構體

type Context interface {// Deadline 返回此 Context 被取消的時間點。// 如果未設置截止時間,ok 為 false。Deadline() (deadline time.Time, ok bool)// Done 返回一個 channel。當 Context 被取消或超時后,此 channel 會被關閉。// 這是一個只讀的 channel。關閉的 channel 仍然可以讀取,會立即返回零值。// 通過 select 語句監聽 Done channel 的關閉,是接收取消信號的關鍵。Done() <-chan struct{}// Err 返回 Context 為何被取消的錯誤。// 如果 Done channel 還未被關閉,返回 nil。// 如果已被關閉,返回非 nil 的錯誤解釋原因:context.Canceled 或 context.DeadlineExceeded。Err() error// Value 允許 Context 攜帶請求域的數據。// 這些數據必須是安全的,以供多個 Goroutine 同時使用。// 應該用于傳遞非必要的、過渡性的數據,而非函數的可選參數。Value(key any) any
}

2.根與派生
創建根上下文

context.Background() 
context.TODO() 

派生(包裝)現有上下文
WithCancel 是基礎的可取消上下文包裝,返回的cancel,調用后即可以立刻取消包裝后的上下文,以及其派生上下文(不會影響到父上下文)
WithDeadline,WithTimeout是帶截止時間/時間間隔的可取消上下文包裝
WithValue 是包裝消息,一般是一些貫穿全文的必要信息比如:用戶id, token等

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

3.取消上下文原理:
以 func WithCancel(parent Context) (ctx Context, cancel CancelFunc) 為例:
3.1封裝的 ctx有方法 Done() <-chan struct{},調用cancel后會給 Done() 的通道發送消息。監聽這個通道的其他協程收到消息就可以返回(一般通過 select case default)。
3.2 構建關聯(propagateCancel):
這個是解決當前上下文取消后,子上下文也被取消的關鍵:
派生的上下文如果是 cancelctx, 那么他會檢查父上下文是不是也是,如果是的話,會將自己加入到 父context的 childmap,當父上下文被取消后,會遍歷childmap來取消子上下文。
(ps: 父子上下文指的是包裝前后,而不是函數傳遞。)
4. 實踐總結:
4.1 誰創建誰取消:

ctx, cancel :=WithCancel(context.Background() )
defer cancel()	// 直接defer取消

4.2 Done chan 是只讀的
4.3謹慎適用 WithValue,這個一般只傳貫穿全文的必要信息比如:用戶id, token等,具體的參數 通過函數參數傳遞
4.4 context對象是不可變的(不能從普通變成cancelctx),只能包裝
4.5 context 的三大作用:取消信號,超時/截止時取消信號,WithValue存信息

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/98814.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/98814.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/98814.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

VS2022 + Qt5.9 中文亂碼/項目設置utf-8編碼

&#x1f6e0;? 解決QT5.9 VS2022中文亂碼的全面方案 &#x1f4c1; 1. 檢查文件編碼與編譯器設置 確保源文件是 帶BOM的UTF-8 編碼對MSVC編譯器很重要。VS2022默認可能使用本地編碼&#xff08;如GB2312&#xff09;解析源文件&#xff0c;即使文件以UTF-8保存。 查看和設置…

數據庫--MySQL數據管理

數據庫–MySQL數據管理 文章目錄數據庫--MySQL數據管理1.外鍵管理2.數據庫數據管理3.DML語言3.1添加數據3.2修改數據3.3刪除數據4.練習1.外鍵管理 外鍵概念 如果公共關鍵字在一個關系中是主關鍵字&#xff0c;那么這個公共關鍵字被稱為另一個關系的外鍵。由此可見&#xff0c;…

【C++練習】13.C++輸出九九乘法表的方法詳解

目錄 C++輸出九九乘法表的方法詳解 方法1:雙重for循環(最基礎) 思考: 代碼分析: 特點: 方法2:使用while循環 思考: 代碼分析: 特點: 方法3:使用遞歸實現 思考: 代碼分析: 特點: 方法4:格式化輸出(對齊美觀) 思考: 代碼分析: 特點: 方法5:使用函數封裝 思考…

MVC及其衍生

MVC 把軟件分成模型&#xff08;Model&#xff09;、視圖&#xff08;View&#xff09;、控制器&#xff08;Controller&#xff09;三個基本部分。 事實上對應著 Controller——輸入 用戶交互&#xff0c;將輸入處理成Controller能處理的形式 Model——處理 描述狀態、邏輯規律…

微碩WINSOK MOS管WSF3089,賦能汽車轉向系統安全升級

隨著汽車電子化程度不斷提高&#xff0c;轉向系統對高效功率器件的需求日益增長。微碩WINSOK推出的N溝道Trench MOS管WSF3089&#xff0c;以30 V/72 A大電流、4.5 mΩ超低導通電阻和TO-252-2L緊湊封裝&#xff0c;為EPS&#xff08;電動助力轉向&#xff09;電機驅動、電源管理…

淘寶拍立淘接口的接入與應用||item_search_img-按圖搜索淘寶商品(拍立淘)

淘寶拍立淘接口的接入與應用如下&#xff1a;接入流程注冊與認證&#xff1a;開發者賬號注冊&#xff1a;訪問淘寶開放平臺&#xff0c;進行開發者賬號注冊。創建應用&#xff1a;在控制臺創建新應用&#xff0c;獲取 App Key 和 App Secret&#xff0c;這是接口調用的憑證。申…

Python學習-day8 元組tuple

元組&#xff08;Tuple&#xff09;是Python中一種不可變的序列類型&#xff0c;用于存儲多個有序元素。與列表&#xff08;List&#xff09;類似&#xff0c;但元組一旦創建后不能修改&#xff08;不可添加、刪除或修改元素&#xff09;&#xff0c;這使得它在安全性、性能優化…

大數據畢業設計選題推薦-基于大數據的國家醫用消耗選品采集數據可視化分析系統-Hadoop-Spark-數據可視化-BigData

?作者主頁&#xff1a;IT畢設夢工廠? 個人簡介&#xff1a;曾從事計算機專業培訓教學&#xff0c;擅長Java、Python、PHP、.NET、Node.js、GO、微信小程序、安卓Android等項目實戰。接項目定制開發、代碼講解、答辯教學、文檔編寫、降重等。 ?文末獲取源碼? 精彩專欄推薦?…

二次學習C語言補充2

文章目錄表棧、隊列、二叉樹一、二叉樹二、表棧三、隊列鏈表一、單向鏈表二、循環鏈表、雙向鏈表和雙向循環鏈表預處理一、預處理二、宏定義文件文件操作補充本篇文章是對二次學習C語言12——文件操作 二次學習C語言14——預處理及模塊化 二次學習C語言15——鏈表 二次學習C語言…

2.9Vue創建項目(組件)的補充

1.再創建和引入vue的選擇2.VsCode插件 安裝Vue自己搜索最新的3.style自己的作用域在一個組件中引入另一個文件的子組件&#xff0c;給當前組件設置樣式&#xff0c;那么子組件的樣式也會改變的。為了解決這個問題 我們在自己的style中設置一個屬性4.另一種創建vue 的方式(主流…

算法高頻題

刷題&#xff1a;LeetCode&#xff08;Top 100-150題&#xff0c;至少刷兩遍&#xff09;。重點&#xff1a;鏈表、樹、二分查找、動態規劃、回溯、棧/隊列。 每一個題型&#xff0c;前10個高頻題 算法思考框架參考&#xff1a;算法題思維框架-CSDN博客 高頻順序參考網站&…

服務器安裝 LDOPE(MODIS 數據處理工具)

目錄下載方式1-&#xff08;簡單快捷&#xff09;根據WRF-VPRM 需要打補丁下載方式2&#xff1a;&#xff08;手動安裝依賴&#xff09;一、安裝所需依賴庫&#xff08;4 個主庫 2 個基礎庫&#xff09;另- HDF-EOS 手動編譯二、解壓并安裝 LDOPE參考下載方式1-&#xff08;簡…

克隆代幣 + 捆綁開盤:多鏈環境下的低成本發幣玩法

在加密世界&#xff0c;發幣已經不再是“少數開發者的專利”。隨著工具的普及&#xff0c;任何人都可以快速發行一個在加密世界&#xff0c;發幣已經不再是“少數開發者的專利”。隨著工具的普及&#xff0c;任何人都可以快速發行一個代幣。但問題是&#xff1a;如何在保證低成…

數據結構中的 二叉樹

1.前言 在 Java 中&#xff0c;樹&#xff08;Tree&#xff09;是一種非線性數據結構&#xff0c;由節點&#xff08;Node&#xff09;組成&#xff0c;常見的線性表則是我們之前學過的順序表、鏈表、棧、隊列等等。每個節點包含數據和指向子節點的引用。樹的常見實現方式包括二…

IntelliJ IDEA 啟動項目時配置端口指南

&#x1f31f; 一、為什么需要手動設置啟動端口&#xff1f; 默認情況下&#xff0c;Spring Boot 應用會使用 8080 端口啟動。但在以下場景中&#xff0c;我們必須自定義端口&#xff1a; 多個微服務同時運行&#xff0c;需避免端口沖突&#xff1b;團隊協作開發&#xff0c;統…

spark sql之from_json函數

目錄前言函數語法參數說明返回值案例案例1案例2前言 在Spark SQL中&#xff0c;from_json函數用于解析包含JSON字符串的列&#xff0c;并將其轉換為Spark SQL的結構化類型&#xff08;如struct、map或array&#xff09; 函數語法 from_json(jsonStr, schema [, options])參數…

數據結構 之 【位圖的簡介】

目錄 1.位圖的引入 2.位圖概念 3.位圖的實現 3.1前提準備 3.2set 3.3reset 3.4test 4.位圖的應用 1.位圖的引入 給40億個不重復的無符號整數&#xff0c;沒排過序 再給一個無符號整數&#xff0c;如何快速判斷這個無符號整數是否在 這40億個數中 首先&#xff0c;一個…

[iOS] ViewController 的生命周期

文章目錄前言一、UIViewController 生命周期有關函數二、UIViewController 中函數的執行順序運行結果1.present和dismiss2.push和pop三、總結前言 UIViewController 是在 iOS 開發中一個非常重要的角色&#xff0c;他是 view 和 model 的橋梁&#xff0c;通過 UIViewControlle…

第30章 零售與電商AI應用

本章將深入探討人工智能在零售與電商領域的革命性應用。我們將從智能推薦系統、動態定價、庫存管理到創新的虛擬試衣間&#xff0c;全面解析AI如何重塑購物體驗和商業運營效率&#xff0c;并為每個關鍵技術點提供代碼實戰&#xff0c;幫助你掌握將AI應用于真實商業場景的能力。…

QT通過QModbusRtuSerialMaster讀寫電子秤數據實例

一、電子稱常用功能&#xff1a;稱重、清零、去皮&#xff1b;電子秤的通訊方式&#xff1a;Modbus通信、串口通信。二、QT讀寫電子秤軟件界面如下&#xff1a;三、核心代碼如下&#xff1a;.pro項目文件代碼&#xff1a;QT core gui serialbus serialport.h頭文件代碼#…