package main
import (
"context"
"fmt"
"time"
)
func main() {
ctx := context.Background()
cancelCtx, cancel := context.WithCancel(ctx)
go doTask(cancelCtx)
time.Sleep(1 * time.Second)
cancel()
time.Sleep(1 * time.Second)
}
func doTask(ctx context.Context) {
for {
select {
case <-ctx.Done():
fmt.Println("Task canceled")
return
default:
fmt.Println("Running task...")
time.Sleep(500 * time.Millisecond)
}
}
}
在上述示例中,我们首先使用 context.Background() 创建了一个初始的上下文 ctx。然后,使用 context.WithCancel(ctx) 派生了一个可取消的上下文 cancelCtx 和相应的取消函数 cancel。接下来,我们在 doTask() 函数中执行一个任务,并在每次循环中检查上下文的取消信号。
在主函数中,我们等待一段时间后,调用 cancel() 函数取消任务。这会触发与 cancelCtx 关联的上下文的取消信号,使得 doTask() 函数可以感知到任务已被取消,并退出执行。
总之,context.WithCancel(ctx) 用于派生一个可取消的上下文,并返回与之关联的取消函数。通过调用取消函数,可以触发与上下文相关的 Goroutine 的取消信号,从而实现对任务的取消和中止。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程