面试题答案
一键面试- 创建
context
对象并传递取消函数: 在主函数中使用context.WithCancel
函数创建一个可取消的context
对象和对应的取消函数。示例代码如下:package main import ( "context" "fmt" "time" ) func func1(ctx context.Context) { for { select { case <-ctx.Done(): fmt.Println("func1收到取消信号,退出") return default: fmt.Println("func1正在执行") time.Sleep(1 * time.Second) } } } func func2(ctx context.Context) { for { select { case <-ctx.Done(): fmt.Println("func2收到取消信号,退出") return default: fmt.Println("func2正在执行") time.Sleep(1 * time.Second) } } } func func3(ctx context.Context) { for { select { case <-ctx.Done(): fmt.Println("func3收到取消信号,退出") return default: fmt.Println("func3正在执行") time.Sleep(1 * time.Second) } } } func main() { ctx, cancel := context.WithCancel(context.Background()) go func1(ctx) go func2(ctx) go func3(ctx) time.Sleep(3 * time.Second) cancel() // 发送取消信号 time.Sleep(2 * time.Second) // 等待所有函数退出 }
- 在并发函数中响应取消信号:
在
func1
、func2
、func3
函数内部,通过select
语句监听ctx.Done()
通道。当该通道接收到数据时,说明收到了取消信号,此时函数可以进行必要的清理工作并安全退出。
在上述代码中:
- 首先在
main
函数中使用context.WithCancel(context.Background())
创建了一个可取消的context
对象ctx
和取消函数cancel
。 - 然后通过
go
关键字启动func1
、func2
、func3
并发函数,并将ctx
作为参数传递进去。 - 在
main
函数中等待3秒后调用cancel()
函数,向所有并发函数发送取消信号。 func1
、func2
、func3
函数内部通过select
监听ctx.Done()
通道,收到取消信号后打印信息并退出循环,从而安全退出函数。