最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go設置http請求超時的方法實現

 更新時間:2024年08月11日 10:11:05   作者:Grassto  
這篇文章主要介紹了Go設置http請求超時的方法實現,最近接手了一個老項目進行維護,發(fā)現其中有個關于 http 請求的方法設置的 timeout 沒有生效,很奇怪,一開始查看代碼并沒有發(fā)現什么可疑點,后查看了源碼,打斷點調試才發(fā)現問題所在,這里簡單記錄復盤一下

背景

最近接手了一個老項目進行維護,發(fā)現其中有個關于 http 請求的方法設置的 timeout 沒有生效,很奇怪!

一開始查看代碼并沒有發(fā)現什么可疑點,后查看了源碼,打斷點調試才發(fā)現問題所在,這里簡單記錄復盤一下。

說明:本篇的源碼的 go 版本是 1.20.2 。

問題

示例代碼

package main

import (
	"context"
	"fmt"
	"net/http"
	"time"
)

func main() {
	req, err := http.NewRequest(http.MethodGet, "https://www.baidu.com", nil)
	if err != nil {
		panic(err)
	}

	ctx, cancel := context.WithTimeout(context.Background(), time.Millisecond)
	defer cancel()
	req.WithContext(ctx)

	resp, err := http.DefaultClient.Do(req)
	if err != nil {
		panic(err)
	}

	//resp.Write(os.Stdout)
	fmt.Println("end: ", resp.StatusCode)
}

程序正常跑完并輸出了,但是預期的是 http.DefaultClient.Do(req) 這里會直接報錯,難道請求 1ms 就結束了??Why???

大家可以自己看下這段代碼哪里有問題。

先說解決,其實就是 req.WithContext(ctx) 生成的是一個新的 http.Request 對象,上述的問題代碼中并沒有將其賦值給當前的 http.Request。大意了,沒有閃。

req = req.WithContext(ctx)

WithContext 方法的源碼如下(net/http/request.go 356)

func (r *Request) WithContext(ctx context.Context) *Request {
	if ctx == nil {
		panic("nil context")
	}
	r2 := new(Request)
	*r2 = *r
	r2.ctx = ctx
	return r2
}

請求超時設置

翻了下源碼,看了下超時設置的方式,http 設置超時主要有兩種方式:

  • http.Client
	c := http.Client{
		Timeout: time.Minute,
	}
	c.Do(req)
  • http.Request 設置 context 超時
	ctx, cancel := context.WithTimeout(context.Background(), time.Minute)
	defer cancel()
	req = req.WithContext(ctx)

在 Client 上指定 Timeout 會作用于通過該 Client 發(fā)起的所有請求,而 Request 設置 Context,僅針對這一次請求。使用的時候需要注意自己的場景。

設置 Tcp 連接階段的超時可以這樣:

client := http.Client{
	Transport: &http.Transport{
		Dial: (&net.Dialer{
			Timeout:   2  * time.Second, //  tcp 連接時設置的連接超時
			Deadline:  time.Now().Add(3  * time.Second),  // 超時強制關閉
		}).Dial,
		TLSHandshakeTimeout: 2 * time.Second, //https 握手超時
	},
	Timeout: 5 * time.Second,
}

可以設置 Transport 中的 Dial

總結

平常自己使用 http 發(fā)送請求設置超時,都是直接給 http.Client 對象設置 Timeout 屬性,很少使用這種對單個 Request 設置超時的。

其實還是個熟練度問題,平常源碼讀的比較少。有空讀讀源碼不僅可以在使用代碼的時候更得心應手,也能夠學習借鑒源碼的代碼設計實現。對自己平常經常需要使用的庫,還是建議都過一遍源碼,很不錯的一個打發(fā)空閑時間的方式。

以上就是Go設置http請求超時的方法實現的詳細內容,更多關于Go設置http請求超時的資料請關注腳本之家其它相關文章!

相關文章

  • Go語言struct要使用?tags的原因解析

    Go語言struct要使用?tags的原因解析

    這篇文章主要介紹了為什么?Go?語言?struct?要使用?tags,在本文中,我們將探討為什么 Go 語言中需要使用 struct tags,以及 struct tags 的使用場景和優(yōu)勢,需要的朋友可以參考下
    2023-03-03
  • 淺析Go中原子操作的重要性與使用

    淺析Go中原子操作的重要性與使用

    這篇文章主要帶大家一起探索?Go?中原子操作的概念,了解為什么它們是重要的,以及如何有效地使用它們,文中的示例代碼講解詳細,需要的可以了解下
    2023-11-11
  • Go anko實現支持腳本語言

    Go anko實現支持腳本語言

    anko是一個可以讓 Go 項目支持腳本語言的小工具,換句話說,就是可以給 Go 項目加點“腳本魔法”,下面就跟隨小編一起來學習一下他的具體使用吧
    2024-11-11
  • Golang實現斷點續(xù)傳功能

    Golang實現斷點續(xù)傳功能

    這篇文章主要為大家詳細介紹了Golang實現斷點續(xù)傳、復制文件功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • Go JSON中序列化大整數精度丟失的問題分析

    Go JSON中序列化大整數精度丟失的問題分析

    當存儲或傳輸 大整數(int64) 時,往往會出現精度丟失的問題,本文通過一個示例來詳細分析原因,并給出解決方案,文中的示例代碼講解詳細,感興趣的小伙伴可以了解下
    2026-01-01
  • go語言學習之包和變量詳解

    go語言學習之包和變量詳解

    這篇文章主要給大家愛介紹了關于go語言學習之包和變量的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用go語言具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-06-06
  • Golang?流水線設計模式實踐示例詳解

    Golang?流水線設計模式實踐示例詳解

    這篇文章主要為大家介紹了Golang?流水線設計模式實踐示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • 關于golang中map使用的幾點注意事項總結(強烈推薦!)

    關于golang中map使用的幾點注意事項總結(強烈推薦!)

    map是一種無序的基于key-value的數據結構,Go語言中的map是引用類型,必須初始化才能使用,下面這篇文章主要給大家介紹了關于golang中map使用的幾點注意事項,需要的朋友可以參考下
    2023-01-01
  • golang模板template自定義函數用法示例

    golang模板template自定義函數用法示例

    這篇文章主要介紹了golang模板template自定義函數用法,結合實例形式分析了Go語言模板自定義函數的基本定義與使用方法,需要的朋友可以參考下
    2016-07-07
  • 深入探究Go語言中for?range語句

    深入探究Go語言中for?range語句

    為了更加便捷地遍歷這些數據類型,Go語言引入了for...range語句,本文將以數組遍歷為起點,逐步介紹for...range語句在不同數據類型中的應用,希望對大家有所幫助
    2023-06-06

最新評論

上高县| 霍山县| 资溪县| 宁强县| 榆树市| 小金县| 万年县| 宝应县| 南阳市| 赤壁市| 女性| 南郑县| 贡嘎县| 阳东县| 南岸区| 缙云县| 阳谷县| 旺苍县| 建阳市| 巍山| 永年县| 巴彦淖尔市| 沈丘县| 慈利县| 封丘县| 乐安县| 银川市| 屏东市| 独山县| 湄潭县| 固安县| 辛集市| 边坝县| 商水县| 平顺县| 鹤峰县| 霍山县| 凯里市| 汉沽区| 甘南县| 咸阳市|