利用 defer 计算 goroutine 的执行时间 from projectdiscovery/katana go func() { defer func(startTime time.Time) { timeTaken = time.Since(startTime) close(results) }(time.Now()) // time.Now() 在 defer 函数定义时就执行 ctx := context.Background() wg := &sync.WaitGroup{} for _, s := range c.sources { wg.Add(1) go func(source source.Source) { for result := range source.Run(ctx, c.Shared, rootURL) { results <- result } wg.Done() }(s) } wg.Wait() }() 监听 Ctrl-C(SIGINT)进行处理 // close handler resumeFilename := defaultResumeFilename() go func() { c := make(chan os.Signal, 1) signal.Notify(c, os.Interrupt, syscall.SIGTERM) for range c { gologger.DefaultLogger.Info().Msg("- Ctrl+C pressed in Terminal") katanaRunner.Close() gologger.Info().Msgf("Creating resume file: %s\n", resumeFilename) err := katanaRunner.SaveState(resumeFilename) if err != nil { gologger.Error().Msgf("Couldn't create resume file: %s\n", err) } os.Exit(0) } }()