面试题答案
一键面试- 传递方式简述:在Go语言中,将父goroutine的
context
传递给子goroutine,只需要在启动子goroutine时,将父context
作为参数传递进去。这样,当父context
被取消或超时,子goroutine可以通过context
感知到,从而进行相应的清理操作并退出。 - 示例代码:
package main
import (
"context"
"fmt"
"time"
)
func childGoroutine(ctx context.Context, id int) {
for {
select {
case <-ctx.Done():
fmt.Printf("Child goroutine %d received cancel signal, exiting...\n", id)
return
default:
fmt.Printf("Child goroutine %d is working...\n", id)
time.Sleep(1 * time.Second)
}
}
}
func main() {
ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
defer cancel()
for i := 1; i <= 3; i++ {
go childGoroutine(ctx, i)
}
time.Sleep(5 * time.Second)
fmt.Println("Main goroutine is done")
}
在上述代码中:
main
函数中创建了一个带有3秒超时的context
,并通过cancel
函数用于手动取消context
。- 启动了3个子goroutine,每个子goroutine接收父
context
。 - 子goroutine在循环中通过
select
监听ctx.Done()
通道,当接收到取消信号时,打印信息并退出。