面试题答案
一键面试- 创建
context
:context.Background
:用于创建一个根context
,通常作为其他context
的父context
,例如:
ctx := context.Background()
context.TODO
:当不确定使用哪种context
时,可以使用context.TODO
,它本质上也是一个空的context
,例如:
ctx := context.TODO()
context.WithCancel
:用于创建一个可取消的context
。它接受一个父context
,返回一个新的context
和一个取消函数cancel
。
parent := context.Background() ctx, cancel := context.WithCancel(parent) defer cancel() // 确保在函数结束时调用取消函数,释放资源
context.WithDeadline
:创建一个带有截止时间的context
。它接受一个父context
和一个截止时间deadline
。
parent := context.Background() deadline := time.Now().Add(5 * time.Second) ctx, cancel := context.WithDeadline(parent, deadline) defer cancel()
context.WithTimeout
:创建一个带有超时时间的context
。它接受一个父context
和一个超时时间timeout
。
parent := context.Background() ctx, cancel := context.WithTimeout(parent, 5*time.Second) defer cancel()
- 在goroutine中监听取消信号:
在
goroutine
中,可以通过ctx.Done()
通道来监听取消信号。当context
被取消(通过调用cancel
函数、达到截止时间或超时)时,ctx.Done()
通道会被关闭。go func(ctx context.Context) { for { select { case <-ctx.Done(): // 处理取消逻辑,例如清理资源等 fmt.Println("goroutine收到取消信号,退出") return default: // 正常业务逻辑 fmt.Println("goroutine正在执行任务") time.Sleep(1 * time.Second) } } }(ctx)