面试题答案
一键面试在Go语言中,context
包用于在多个goroutine
之间传递截止时间、取消信号和其他请求范围的值。要管理取消信号在父子goroutine
之间的传递,可以使用context.WithCancel
函数。以下是具体步骤和示例代码:
-
创建一个
context
和取消函数: 使用context.WithCancel
函数创建一个context
和对应的取消函数。这个context
会被传递给需要管理取消信号的goroutine
。 -
传递
context
: 将创建的context
传递给子goroutine
。子goroutine
可以通过监听context.Done()
通道来检测是否收到取消信号。 -
取消操作: 在父
goroutine
中,当需要取消子goroutine
时,调用取消函数。这会关闭context.Done()
通道,从而通知所有监听该通道的goroutine
。
示例代码如下:
package main
import (
"context"
"fmt"
"time"
)
func worker(ctx context.Context) {
for {
select {
case <-ctx.Done():
fmt.Println("收到取消信号,停止工作")
return
default:
fmt.Println("正在工作...")
time.Sleep(1 * time.Second)
}
}
}
func main() {
ctx, cancel := context.WithCancel(context.Background())
go worker(ctx)
// 模拟一些工作
time.Sleep(3 * time.Second)
// 取消操作
cancel()
// 等待子goroutine完全停止
time.Sleep(1 * time.Second)
fmt.Println("程序结束")
}
在上述代码中:
context.WithCancel(context.Background())
创建了一个可取消的context
和对应的取消函数cancel
。worker
函数是一个子goroutine
,它通过select
语句监听ctx.Done()
通道。当该通道接收到值时,意味着收到取消信号,worker
函数停止工作。- 在
main
函数中,启动worker
子goroutine
后,等待3秒,然后调用cancel
函数取消context
,最后等待1秒确保子goroutine
完全停止后程序结束。