defer
和 go
语句中的 func
文字内对循环变量的引用。
这样的变量可能具有意外值,因为它们没有被复制到 func
文字中,并且 defer
和 go
中 func
文字不会立即执行。
有关闭包和 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)
}()
}
请注意,仅当 defer
和 go
语句是循环主体中的最后一个语句时,分析器才会检查它们。
否则,分析可能会产生错误的检测结果。