报告在 defergo 语句中的 func 文字内对循环变量的引用。 这样的变量可能具有意外值,因为它们没有被复制到 func 文字中,并且 defergofunc 文字不会立即执行。

有关闭包和 goroutine 的更多信息,请参见 golang.org 上的 What happens with closures running as goroutines? 页面。

示例:

for _, v := range []string{"a", "b", "c"} {
  go func() {
    fmt.Println(v) // 输出可能会是 `c c c`,而不是 `a b c`。
  }()
}

在应用快速修复后:

for _, v := range []string{"a", "b", "c"} {
  v := v // `v` 现已被复制
  go func() {
    fmt.Println(v)
  }()
}

请注意,仅当 defergo 语句是循环主体中的最后一个语句时,分析器才会检查它们。 否则,分析可能会产生错误的检测结果。