亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Go設(shè)置http請(qǐng)求超時(shí)的方法實(shí)現(xiàn)

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

背景

最近接手了一個(gè)老項(xiàng)目進(jìn)行維護(hù),發(fā)現(xiàn)其中有個(gè)關(guān)于 http 請(qǐng)求的方法設(shè)置的 timeout 沒(méi)有生效,很奇怪!

一開(kāi)始查看代碼并沒(méi)有發(fā)現(xiàn)什么可疑點(diǎn),后查看了源碼,打斷點(diǎn)調(diào)試才發(fā)現(xiàn)問(wèn)題所在,這里簡(jiǎn)單記錄復(fù)盤一下。

說(shuō)明:本篇的源碼的 go 版本是 1.20.2 。

問(wèn)題

示例代碼

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)
}

程序正常跑完并輸出了,但是預(yù)期的是 http.DefaultClient.Do(req) 這里會(huì)直接報(bào)錯(cuò),難道請(qǐng)求 1ms 就結(jié)束了??Why???

大家可以自己看下這段代碼哪里有問(wèn)題。

先說(shuō)解決,其實(shí)就是 req.WithContext(ctx) 生成的是一個(gè)新的 http.Request 對(duì)象,上述的問(wèn)題代碼中并沒(méi)有將其賦值給當(dāng)前的 http.Request。大意了,沒(méi)有閃。

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
}

請(qǐng)求超時(shí)設(shè)置

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

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

在 Client 上指定 Timeout 會(huì)作用于通過(guò)該 Client 發(fā)起的所有請(qǐng)求,而 Request 設(shè)置 Context,僅針對(duì)這一次請(qǐng)求。使用的時(shí)候需要注意自己的場(chǎng)景。

設(shè)置 Tcp 連接階段的超時(shí)可以這樣:

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

可以設(shè)置 Transport 中的 Dial

總結(jié)

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

其實(shí)還是個(gè)熟練度問(wèn)題,平常源碼讀的比較少。有空讀讀源碼不僅可以在使用代碼的時(shí)候更得心應(yīng)手,也能夠?qū)W習(xí)借鑒源碼的代碼設(shè)計(jì)實(shí)現(xiàn)。對(duì)自己平常經(jīng)常需要使用的庫(kù),還是建議都過(guò)一遍源碼,很不錯(cuò)的一個(gè)打發(fā)空閑時(shí)間的方式。

以上就是Go設(shè)置http請(qǐng)求超時(shí)的方法實(shí)現(xiàn)的詳細(xì)內(nèi)容,更多關(guān)于Go設(shè)置http請(qǐng)求超時(shí)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 詳解Golang如何優(yōu)雅的終止一個(gè)服務(wù)

    詳解Golang如何優(yōu)雅的終止一個(gè)服務(wù)

    后端服務(wù)通常會(huì)需要?jiǎng)?chuàng)建子協(xié)程來(lái)進(jìn)行相應(yīng)的作業(yè),但進(jìn)程接受到終止信號(hào)或正常結(jié)束時(shí),并沒(méi)有判斷或等待子協(xié)程執(zhí)行結(jié)束,下面這篇文章主要給大家介紹了關(guān)于Golang如何優(yōu)雅的終止一個(gè)服務(wù)的相關(guān)資料,需要的朋友可以參考下
    2022-03-03
  • 使用Gin框架返回JSON、XML和HTML數(shù)據(jù)

    使用Gin框架返回JSON、XML和HTML數(shù)據(jù)

    Gin是一個(gè)高性能的Go語(yǔ)言Web框架,它不僅提供了簡(jiǎn)潔的API,還支持快速的路由和中間件處理,在Web開(kāi)發(fā)中,返回JSON、XML和HTML數(shù)據(jù)是非常常見(jiàn)的需求,本文將介紹如何使用Gin框架來(lái)返回這三種類型的數(shù)據(jù),需要的朋友可以參考下
    2024-08-08
  • Golang庫(kù)插件注冊(cè)加載機(jī)制的問(wèn)題

    Golang庫(kù)插件注冊(cè)加載機(jī)制的問(wèn)題

    這篇文章主要介紹了Golang庫(kù)插件注冊(cè)加載機(jī)制,這里說(shuō)的插件并不是指的golang原生的可以在buildmode中加載指定so文件的那種加載機(jī)制,需要的朋友可以參考下
    2022-03-03
  • 詳解Go語(yǔ)言如何解析帶注釋的json

    詳解Go語(yǔ)言如何解析帶注釋的json

    標(biāo)準(zhǔn)的json格式是不帶注釋,但是有時(shí)候?yàn)榱朔奖憷斫鈐son中各字段的含義,需要支持帶注釋的json,這篇文章主要介紹了Go語(yǔ)言解析帶注釋json的相關(guān)方法,希望對(duì)大家有所幫助
    2024-03-03
  • Golang實(shí)現(xiàn)web文件共享服務(wù)的示例代碼

    Golang實(shí)現(xiàn)web文件共享服務(wù)的示例代碼

    這篇文章主要介紹了Golang實(shí)現(xiàn)web文件共享服務(wù)的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-10-10
  • Golang中map縮容的實(shí)現(xiàn)

    Golang中map縮容的實(shí)現(xiàn)

    本文主要介紹了Go語(yǔ)言中map的擴(kuò)縮容機(jī)制,包括grow和hashGrow方法的處理,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-03-03
  • Golang服務(wù)中context超時(shí)處理的方法詳解

    Golang服務(wù)中context超時(shí)處理的方法詳解

    在Go語(yǔ)言中,Context是一個(gè)非常重要的概念,它存在于一個(gè)完整的業(yè)務(wù)生命周期內(nèi),Context類型是一個(gè)接口類型,在實(shí)際應(yīng)用中,我們可以使用Context包來(lái)傳遞請(qǐng)求的元數(shù)據(jù),本文將給大家介紹Golang服務(wù)中context超時(shí)處理的方法和超時(shí)原因,需要的朋友可以參考下
    2023-05-05
  • Go語(yǔ)言中高效地處理集合的方法小結(jié)

    Go語(yǔ)言中高效地處理集合的方法小結(jié)

    在?Go?語(yǔ)言中,處理集合(如切片、映射等)時(shí),可以通過(guò)多種方式提高效率,本文為大家整理了一些常見(jiàn)的方法,有需要的小伙伴可以了解一下
    2025-02-02
  • go xorm存庫(kù)處理null值問(wèn)題

    go xorm存庫(kù)處理null值問(wèn)題

    這篇文章主要介紹了go xorm存庫(kù)處理null值問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Golang中如何對(duì)MySQL進(jìn)行操作詳解

    Golang中如何對(duì)MySQL進(jìn)行操作詳解

    這篇文章主要給大家介紹了關(guān)于在Golang中如何對(duì)MySQL進(jìn)行操作的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用Golang具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03

最新評(píng)論