这个错误是由于在使用 sync.WaitGroup 时,调用了过多的 Done() 方法,导致 WaitGroup 计数器变成负数,从而触发 panic。

一般来说,这个错误会在以下两种情况下出现:

  1. Done() 方法被多次调用。

  2. Wait() 方法被多次调用。

为了避免这个错误,我们需要确保在调用 Done() 方法或 Wait() 方法之前,计数器的值不为零。如果计数器的值为零,则不应该再调用 Done() 方法。同样地,如果计数器的值为负数,则不应该再调用 Wait() 方法。

以下是一个示例程序,演示了如何避免这个错误:

package main

import (
    "fmt"
    "sync"
)

func main() {
    var wg sync.WaitGroup
    for i := 0; i < 10; i++ {
        wg.Add(1)
        go func() {
            // do something
            wg.Done()
        }()
    }
    wg.Wait()
    fmt.Println("All goroutines have finished.")
}

在这个示例中,我们首先使用 Add() 方法将计数器增加到 10。然后,我们启动 10 个 goroutine,每个 goroutine 执行一些任务,并在完成后调用 Done() 方法。最后,我们使用 Wait() 方法等待所有 goroutine 完成。由于我们正确地使用了 Add()、Done() 和 Wait() 方法,因此程序不会出现 sync: negative WaitGroup counter 错误。

golang panic: sync: negative WaitGroup counter 报错

原文地址: https://www.cveoy.top/t/topic/ufq 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录