当前位置:网站首页>Usage scenarios of golang context
Usage scenarios of golang context
2022-07-05 06:12:00 【Dawnlighttt】
List of articles
1. Value passed
Value passing is just context An auxiliary function of , Not the core function . Usually we only use context To pass optional data that does not affect the main business logic , Like log information 、 Debugging information, meta information, etc .
package main
import (
"context"
"fmt"
)
func readContext(ctx context.Context) {
traceId, ok := ctx.Value("key").(string)
if ok {
fmt.Println("readContext key=", traceId)i
} else {
fmt.Println("readContext no key")
}
}
func main() {
ctx := context.Background()
readContext(ctx)
ctx = context.WithValue(ctx, "key", "beautiful")
readContext(ctx)
}
In the use of WithValue Yes ctx When packing , You can set a key-value Key value pair , stay goroutine Passed between .
2. Timeout control
http Request to set timeout
package main
import (
"context"
"fmt"
"time"
)
func httpRequest(ctx context.Context) {
for {
// Handle http request
select {
case <- ctx.Done():
fmt.Println("Request timed out")
return
case <- time.After(time.Second):
fmt.Println("Loading...")
}
}
}
func main() {
fmt.Println("start TestTimeoutContext")
ctx, cancel := context.WithTimeout(context.Background(), time.Second * 3)
defer cancel()
httpRequest(ctx)
time.Sleep(time.Second * 5)
}
//start TestTimeoutContext
//Loading...
//Loading...
//Request timed out
file io Or the Internet io Wait for time-consuming operations , You can check whether the remaining time is sufficient , Decide whether to proceed to the next step
package main
import (
"context"
"fmt"
"time"
)
func copyFile(ctx context.Context) {
deadline, ok := ctx.Deadline()
if ok == false {
return
}
// deadline.Sub(time.Now()) The difference between the deadline and the current time
isEnough := deadline.Sub(time.Now()) > time.Second * 5
if isEnough {
fmt.Println("copy file")
} else {
fmt.Println("isEnough is false return")
return
}
}
func main() {
ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(time.Second * 4))
defer cancel()
copyFile(ctx)
time.Sleep(time.Second * 5)
}
//isEnough is false return
3. Cancel control
goroutine Send a cancellation signal , Ensure that the logic emanates from yourself goroutine All cancelled successfully
package main
import (
"context"
"fmt"
"time"
)
func gen(ctx context.Context) <-chan int {
ch := make(chan int)
go func() {
var n int
for {
select {
case ch <- n:
n++
time.Sleep(time.Second)
case <-ctx.Done():
return
}
}
}()
return ch
}
func main() {
// Create a Cancel context
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
for n := range gen(ctx) {
fmt.Println(n)
if n == 5 {
// Trigger after meeting the requirements cancel
cancel()
break
}
}
}
//0
//1
//2
//3
//4
//5
Reference material :
边栏推荐
猜你喜欢
Error ora-28547 or ora-03135 when Navicat connects to Oracle Database
shared_ Repeated release heap object of PTR hidden danger
Analysis of backdoor vulnerability in remote code execution penetration test / / phpstudy of national game title of national secondary vocational network security B module
[jailhouse article] jailhouse hypervisor
LeetCode 0108. Convert an ordered array into a binary search tree - the median of the array is the root, and the left and right of the median are the left and right subtrees respectively
Leetcode-6108: decrypt messages
LaMDA 不可能觉醒吗?
Appium automation test foundation - Summary of appium test environment construction
实时时钟 (RTC)
LVS简介【暂未完成(半成品)】
随机推荐
leetcode-31:下一个排列
LeetCode 0107. Sequence traversal of binary tree II - another method
[rust notes] 14 set (Part 1)
js快速将json数据转换为url参数
leetcode-1200:最小绝对差
【Rust 笔记】16-输入与输出(上)
SQLMAP使用教程(二)实战技巧一
开源存储这么香,为何我们还要坚持自研?
Leetcode-3: Longest substring without repeated characters
PC register
Time of process
Daily question 1984 Minimum difference in student scores
927. 三等分 模拟
The sum of the unique elements of the daily question
[cloud native] record of feign custom configuration of microservices
Leetcode-22: bracket generation
Groupbykey() and reducebykey() and combinebykey() in spark
leetcode-6111:螺旋矩阵 IV
[rust notes] 16 input and output (Part 1)
Solution to game 10 of the personal field