Files
bulma/context_comprehensive.go
T

53 lines
1.2 KiB
Go

package main
import (
"context"
"fmt"
"time"
)
// 自定义上下文键
type key string
const RequestIDKey key = "request_id"
// 数据层:模拟数据库查询
func dataLayer(ctx context.Context) {
reqID, _ := ctx.Value(RequestIDKey).(string)
select {
case <-ctx.Done():
fmt.Printf("[数据层] 请求[%s]:超时取消 | 错误:%v\n", reqID, ctx.Err())
case <-time.After(1800 * time.Millisecond):
fmt.Printf("[数据层] 请求[%s]:数据查询成功\n", reqID)
}
}
// 服务层:业务逻辑处理
func serviceLayer(ctx context.Context) {
reqID, _ := ctx.Value(RequestIDKey).(string)
fmt.Printf("[服务层] 请求[%s]:开始业务处理\n", reqID)
dataLayer(ctx)
}
// API层:接口入口
func apiLayer(ctx context.Context) {
reqID, _ := ctx.Value(RequestIDKey).(string)
fmt.Printf("[API层] 请求[%s]:接收客户端请求\n", reqID)
serviceLayer(ctx)
}
func main() {
// 1. 上下文传递请求ID
ctx := context.WithValue(context.Background(), RequestIDKey, "REQ-2026-COM-001")
// 2. 设置超时时间:1.5秒
ctx, cancel := context.WithTimeout(ctx, 1500*time.Millisecond)
defer cancel()
// 3. 启动全链路调用
apiLayer(ctx)
time.Sleep(2 * time.Second)
fmt.Println("\n主协程:请求生命周期完整结束")
}