package service import ( "sync" "testing" "time" ) // analyzeOnce 应合并并发同键分析请求,只执行一次 fn func TestAnalyzeOnceDedup(t *testing.T) { var mu sync.Mutex calls := 0 fn := func() (bool, string) { mu.Lock() calls++ mu.Unlock() // 短暂阻塞确保所有并发调用在 singleflight 窗口内到达 Do,仅首次执行 fn time.Sleep(50 * time.Millisecond) return true, "dedup" } var wg sync.WaitGroup for i := 0; i < 10; i++ { wg.Add(1) go func() { defer wg.Done() if retry, _ := analyzeOnce("k", fn); !retry { t.Errorf("期望 retryable=true") } }() } wg.Wait() if calls != 1 { t.Fatalf("singleflight应只执行一次fn, got %d", calls) } }