How to use context to implement request timeout control in Go
Jul 21, 2023 pm 12:18 PMHow to use context to implement request timeout control in Go
Introduction:
When we make network requests, we often encounter the problem of request timeout. A network request that does not respond for a long time will not only waste server resources, but also affect overall performance. In order to solve this problem, the Go language introduced the context package, which can be used to implement request timeout control. This article will introduce how to use the context package to implement request timeout control in Go, and attach corresponding code examples.
1. Understanding the context package
The context package is a package provided by the Go language standard library and is used to manage context information related to requests. Through the context package, we can implement functions such as timeout control of requests, cancellation of requests, and transfer of context information between requests.
Before using the context package, we need to first understand some commonly used functions and types in the context package:
- WithCancel(parent Context) (ctx Context, cancel CancelFunc): Returns a Subcontext with cancellation function. When the cancel function is called, the context and its subcontexts are canceled.
- WithDeadline(parent Context, deadline time.Time) (Context, CancelFunc): Returns a sub-context with deadline. When the deadline is reached, the context and its subcontexts are canceled.
- WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc): Returns a sub-context with a timeout. When the timeout is reached, the context and its subcontexts are canceled.
- WithValue(parent Context, key interface{}, val interface{}) Context: Returns a sub-context with key-value pairs.
2. Use the context package to implement request timeout control
The following is a sample code that uses the context package to implement request timeout control:
package main import ( "context" "fmt" "net/http" "time" ) func main() { // 創(chuàng)建一個帶有超時時間的上下文對象 ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) defer cancel() // 創(chuàng)建一個帶有上下文的http請求 req, err := http.NewRequestWithContext(ctx, http.MethodGet, "https://www.example.com", nil) if err != nil { fmt.Println("創(chuàng)建請求失敗:", err) return } // 發(fā)送請求并得到響應 client := http.Client{} resp, err := client.Do(req) if err != nil { fmt.Println("發(fā)送請求失?。?quot;, err) return } defer resp.Body.Close() fmt.Println("請求成功!") }
In the above example code, we first A context object with a 3 second timeout is created by calling context.WithTimeout
. Then, we use the http.NewRequestWithContext
method to create an http request object with context and send the request. Finally, we send the request by calling the client.Do
method and get the response.
Note that when using the http request object with context, we need to use the http.NewRequestWithContext
method instead of the original http.NewRequest
method to create the request object. to pass contextual information to the request.
3. Principle of request timeout control implementation
When we use the http request object with context to send a request, before the request is sent, we will first check whether the context object has expired (i.e., timed out). If the timeout has occurred, the request will be canceled and no network request will be made. This implements request timeout control.
4. Summary
Using the context package can easily implement request timeout control. In actual development, we can set a reasonable timeout as needed to help us avoid unnecessary long waiting and resource waste. By rationally utilizing the context package, we can more flexibly control the execution time of requests and improve the stability and performance of the system.
The above is an introduction to using the context package to implement request timeout control in Go. I hope it will be helpful to you!
The above is the detailed content of How to use context to implement request timeout control in Go. For more information, please follow other related articles on the PHP Chinese website!

Hot AI Tools

Undress AI Tool
Undress images for free

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Go's switch statement will not be executed throughout the process by default and will automatically exit after matching the first condition. 1. Switch starts with a keyword and can carry one or no value; 2. Case matches from top to bottom in order, only the first match is run; 3. Multiple conditions can be listed by commas to match the same case; 4. There is no need to manually add break, but can be forced through; 5.default is used for unmatched cases, usually placed at the end.

AruneinGoisaUnicodecodepointrepresentedasanint32,usedtocorrectlyhandleinternationalcharacters;1.Userunesinsteadofbytestoavoidsplittingmulti-byteUnicodecharacters;2.Loopoverstringswithrangetogetrunes,notbytes;3.Convertastringto[]runetosafelymanipulate

The answer is: Go applications do not have a mandatory project layout, but the community generally adopts a standard structure to improve maintainability and scalability. 1.cmd/ stores the program entrance, each subdirectory corresponds to an executable file, such as cmd/myapp/main.go; 2.internal/ stores private code, cannot be imported by external modules, and is used to encapsulate business logic and services; 3.pkg/ stores publicly reusable libraries for importing other projects; 4.api/ optionally stores OpenAPI, Protobuf and other API definition files; 5.config/, scripts/, and web/ store configuration files, scripts and web resources respectively; 6. The root directory contains go.mod and go.sum

Using bufio.Scanner is the most common and efficient method in Go to read files line by line, and is suitable for handling scenarios such as large files, log parsing or configuration files. 1. Open the file using os.Open and make sure to close the file via deferfile.Close(). 2. Create a scanner instance through bufio.NewScanner. 3. Call scanner.Scan() in the for loop to read line by line until false is returned to indicate that the end of the file is reached or an error occurs. 4. Use scanner.Text() to get the current line content (excluding newline characters). 5. Check scanner.Err() after the loop is over to catch possible read errors. This method has memory effect

Routing in Go applications depends on project complexity. 1. The standard library net/httpServeMux is suitable for simple applications, without external dependencies and is lightweight, but does not support URL parameters and advanced matching; 2. Third-party routers such as Chi provide middleware, path parameters and nested routing, which is suitable for modular design; 3. Gin has excellent performance, built-in JSON processing and rich functions, which is suitable for APIs and microservices. It should be selected based on whether flexibility, performance or functional integration is required. Small projects use standard libraries, medium and large projects recommend Chi or Gin, and finally achieve smooth expansion from simple to complex.

To import local packages correctly, you need to use the Go module and follow the principle of matching directory structure with import paths. 1. Use gomodinit to initialize the module, such as gomodinitexample.com/myproject; 2. Place the local package in a subdirectory, such as mypkg/utils.go, and the package is declared as packagemypkg; 3. Import it in main.go through the full module path, such as import "example.com/myproject/mypkg"; 4. Avoid relative import, path mismatch or naming conflicts; 5. Use replace directive for packages outside the module. Just make sure the module is initialized

BuildconstraintsinGoarecommentslike//go:buildthatcontrolfileinclusionduringcompilationbasedonconditionssuchasOS,architecture,orcustomtags.2.TheyareplacedbeforethepackagedeclarationwithablanklineinbetweenandsupportBooleanoperatorslike&&,||,and

Go's flag package can easily parse command line parameters. 1. Use flag.Type() to define type flags such as strings, integers, and booleans; 2. You can parse flags to variables through flag.TypeVar() to avoid pointer operations; 3. After calling flag.Parse(), use flag.Args() to obtain subsequent positional parameters; 4. Implementing the flag.Value interface can support custom types to meet most simple CLI requirements. Complex scenarios can be replaced by spf13/cobra library.
