package main import ( "context" "fmt" "sync" "time" ) // context.WithValue type TraceCode string var wait sync.WaitGroup func workerProc(ctx context.Context) { key := TraceCode("TRACE_CODE") traceCode, ok := ctx.Value(key).(string) // 在子goroutine中获取trace code if !ok { fmt.Println("invalid trace code") } LOOP: for { fmt.Printf("worker, trace code:%s\n", traceCode) time.Sleep(time.Millisecond * 10) // 假设正常连接数据库耗时10毫秒 select { case <-ctx.Done(): // 50毫秒后自动调用 break LOOP default: } } fmt.Println("worker done!") wait.Done() } func main() { // 设置一个50毫秒的超时 ctx, cancel := context.WithTimeout(context.Background(), time.Millisecond*50) // 在系统的入口中设置trace code传递给后续启动的goroutine实现日志数据聚合 ctx = context.WithValue(ctx, TraceCode("TRACE_CODE"), "12512312234") wait.Add(1) go workerProc(ctx) time.Sleep(time.Second * 5) cancel() // 通知子goroutine结束 wait.Wait() fmt.Println("over") }