面试题答案
一键面试在Go语言中,context
包用于管理子协程的退出逻辑。以下是简述及示例代码:
创建context
通过context
包提供的函数来创建context
,常见的有context.Background()
、context.TODO()
,还可以使用context.WithCancel
、context.WithDeadline
、context.WithTimeout
等函数创建带有取消功能的context
。
传递给子协程
将创建好的context
作为参数传递给需要管理的子协程。
子协程响应取消信号
子协程通过监听context
的取消信号(ctx.Done()
通道关闭)来决定何时退出。
以下是一个简单示例代码:
package main
import (
"context"
"fmt"
"time"
)
func main() {
// 创建一个可取消的context
ctx, cancel := context.WithCancel(context.Background())
// 启动子协程
go func(ctx context.Context) {
for {
select {
case <-ctx.Done():
fmt.Println("子协程收到取消信号,退出")
return
default:
fmt.Println("子协程正在运行...")
time.Sleep(1 * time.Second)
}
}
}(ctx)
// 模拟一些业务逻辑
time.Sleep(3 * time.Second)
// 取消context,通知子协程退出
cancel()
// 等待子协程退出
time.Sleep(1 * time.Second)
}
在上述代码中:
- 使用
context.WithCancel
创建了一个可取消的context
,并返回ctx
和取消函数cancel
。 - 子协程通过
select
监听ctx.Done()
通道,当通道关闭时(即收到取消信号),执行退出逻辑。 - 主函数在运行一段时间后调用
cancel
函数,取消context
,从而通知子协程退出。