wg.Wait() 的两种方式

在 Go 语言中,go func() { ... }() 和直接执行 wg.Wait() 和 close(eligibleComsChan) 的主要区别在于并发执行阻塞行为。以下是详细解释:


1. go func() { ... }() 的形式

go func() {
    wg.Wait()
    close(eligibleComsChan)
}()
  • 并发执行go func() { ... }() 启动了一个新的 goroutine 来执行匿名函数中的代码。这意味着 wg.Wait() 和 close(eligibleComsChan) 会在一个新的 goroutine 中异步执行,不会阻塞当前的 goroutine。
  • 非阻塞:当前 goroutine 会继续执行后续代码,而不会等待 wg.Wait() 完成。
  • 适用场景:如果你希望在后台等待所有 goroutine 完成,并在完成后关闭 channel,而不阻塞当前 goroutine 的执行,可以使用这种方式。

2. 直接执行 wg.Wait() 和 close(eligibleComsChan)

wg.Wait()
close(eligibleComsChan)
  • 同步执行wg.Wait() 会阻塞当前 goroutine,直到所有通过 wg.Add() 添加的 goroutine 都调用了 wg.Done()。之后,close(eligibleComsChan) 才会执行。
  • 阻塞:当前 goroutine 会一直等待,直到所有 goroutine 完成,才会继续执行后续代码。
  • 适用场景:如果你希望确保所有 goroutine 都完成后,再继续执行后续逻辑(例如关闭 channel),可以使用这种方式。

总结

  • go func() { ... }():异步执行,不阻塞当前 goroutine,适合后台任务。
  • 直接执行:同步执行,阻塞当前 goroutine,适合需要等待所有任务完成的场景。

选择哪种方式取决于你的具体需求:是否需要阻塞当前 goroutine,以及是否需要在后台执行等待和关闭操作。