当前位置:网站首页>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 :
边栏推荐
- 7. Processing the input of multidimensional features
- 1996. number of weak characters in the game
- 1.14 - assembly line
- Doing SQL performance optimization is really eye-catching
- Leetcode-9: palindromes
- QQ电脑版取消转义符输入表情
- LeetCode 0108.将有序数组转换为二叉搜索树 - 数组中值为根,中值左右分别为左右子树
- leetcode-6108:解密消息
- [practical skills] how to do a good job in technical training?
- 快速使用Amazon MemoryDB并构建你专属的Redis内存数据库
猜你喜欢
[practical skills] technical management of managers with non-technical background
Spark中groupByKey() 和 reduceByKey() 和combineByKey()
QQ computer version cancels escape character input expression
开源存储这么香,为何我们还要坚持自研?
Brief introduction to tcp/ip protocol stack
4. 对象映射 - Mapping.Mapster
Solution to game 10 of the personal field
Leetcode-6108: decrypt messages
Smart construction site "hydropower energy consumption online monitoring system"
Appium automation test foundation - Summary of appium test environment construction
随机推荐
[rust notes] 14 set (Part 2)
Introduction et expérience de wazuh open source host Security Solution
[rust notes] 13 iterator (Part 2)
【Rust 笔记】15-字符串与文本(下)
Leetcode-6109: number of people who know secrets
做 SQL 性能优化真是让人干瞪眼
2022 极术通讯-Arm 虚拟硬件加速物联网软件开发
打印机脱机时一种容易被忽略的原因
Leetcode-9: palindromes
Daily question 2013 Detect square
传统数据库逐渐“难适应”,云原生数据库脱颖而出
1039 Course List for Student
Daily question 1984 Minimum difference in student scores
Doing SQL performance optimization is really eye-catching
1.14 - 流水线
CPU内核和逻辑处理器的区别
Groupbykey() and reducebykey() and combinebykey() in spark
How to adjust bugs in general projects ----- take you through the whole process by hand
【Rust 笔记】14-集合(下)
SQLMAP使用教程(二)实战技巧一