在 http.HandlerFunc
中我得到了這個。但我的問題是:在應用超時上下文之後放置 defer cancel()
是否有意義?
因為底部的選擇將繼續監聽,直到上下文完成。並且延遲將在上下文完成後執行。但那已經完成了嗎? :)
// Apply timeout context var cancel context.CancelFunc ctx, cancel = context.WithTimeout(ctx, time.Duration(time.Duration(match_route.timeout) * time.Second)) defer cancel() // <--- does this make sense go func(){ match_route.handler(w, r.WithContext(ctx)) cancel() }() select { case <-ctx.Done(): if ctx.Err() == context.DeadlineExceeded { http.Error(w, "Timeout", http.StatusRequestTimeout) } }
是的,我認為這確實有道理,實際上使用defer cancel()
的目的是確保呼叫cancel 函數來釋放與上下文關聯的資源,無論函數如何退出,在您的範例中,cancel()
函數被推遲到http.HandlerFunc
完成後或上下文完成時執行,因此go func ()
負責使用提供的上下文執行match_route.handler
函數,然後呼叫cancel()
明確取消上下文,select
語句用於等待上下文完成,如果由於超過截止日期而完成上下文,則會傳回錯誤回應!
以上是這對 defer cancel() 有意義嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!