2 回答

TA貢獻1775條經驗 獲得超8個贊
根據我的經驗,Context
有兩個主要用例:
傳遞信息。對于您的問題,您可能希望
request_id
為每個請求生成一個并將其傳遞到代碼的最低部分,并記錄它request_id
以在整個代碼庫中進行錯誤跟蹤。此功能并不總是有用,例如您想要初始化 MongoDB 連接,但它是在服務啟動期間完成的。此時沒有有意義的上下文,
context.Background
超時應該足夠了。對從 中檢索到的變異值要小心,
Context
如果您要傳遞Context
所有內容,這可能會導致并發訪問。自動取消和超時。這兩個功能并非無中生有,您需要調整代碼以處理來自
Context
. 但是大多數帶有參數的第三方庫和標準庫Context
都可以很好地處理這兩個特性(例如數據庫庫、HTTP 調用庫)。Context
使用此功能,您可以在失效 后自動回收資源。有時您會想要停止這種級聯行為,例如在后臺 goroutine 中寫入日志,那么您需要創建一個新的 goroutine
context.Background()
以避免這些寫入在上游上下文被取消后被取消。context.Background()
還會清除信息上下文,因此有時您需要從上游上下文中提取上下文信息,并手動將它們附加到這個新上下文中。
Context
將參數強制用于所有函數有點矯枉過正,(添加Context
到簡單greatestCommonDivisor
函數沒有意義)但是將Context
參數添加到您需要的任何地方永遠不會造成傷害。Context
具有足夠好的性能,對于您的用例(HTTP 服務器和數據庫編寫),它不應該對您的服務造成可見的開銷。

TA貢獻1839條經驗 獲得超15個贊
我對自己的問題找到了一個有趣的答案,所以如果有同樣的問題,我更愿意把它放在這里供未來的用戶使用。
如果我將連接到 Mongo 的 SAME 上下文傳遞給 touserController
并將其進一步向下傳遞以CreateUser
運行:
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
注意:不是在函數中取消上下文,而是在NewMongoStore
函數defer cancel()
中取消上下文main
。
10 秒后,如果你打電話POST /users
,你會得到context deadline exceeded
,所以基本上你不能使用這個上下文來做其他事情,你必須在每次CreateUser
調用時創建新的上下文。
所以我寫的很好。在我的示例中,我等待 10 秒連接到mongo
,插入操作上下文等待 1 秒。
- 2 回答
- 0 關注
- 112 瀏覽
添加回答
舉報