以下是Go中使用context.CancelFunc的代码示例:
package main
import (
"context"
"fmt"
"time"
)
func worker(ctx context.Context) {
for {
select {
case <-ctx.Done():
fmt.Println("Worker stopped")
return
default:
fmt.Println("Worker is running")
time.Sleep(time.Second)
}
}
}
func main() {
ctx, cancel := context.WithCancel(context.Background())
go worker(ctx)
time.Sleep(5 * time.Second)
cancel()
time.Sleep(2 * time.Second)
fmt.Println("Main stopped")
}
在这个示例中,worker是一个后台任务,它不断运行并打印信息。在主函数中,我们使用context.WithCancel创建了一个新的上下文,并返回该上下文和一个cancel函数。然后我们启动worker,并让它运行了5秒钟。在这之后,我们调用cancel函数终止worker任务。此后,我们加入2秒的延迟以等待worker最终终止,然后打印“Main stopped”来标记程序的结束。注意在worker中我们使用select语句监听ctx.Done(),一旦这个channel被关闭,worker就会停止运行。而调用cancel函数就会关闭这个channel,让worker停止。