WIP - Go 中常见的错误和陷阱

记录下 Go 中常见的错误和陷阱,不定期更新

匿名函数的作用域

下面的代码运行结果是什么?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package main

import (
"fmt"
)

func main() {
var fs []func()
arr := []int{1, 2, 3, 4, 5}

for _, i := range arr {
fs = append(fs, func() {
fmt.Println(i)
})
}

for _, f := range fs {
f()
}
}

运行结果

1
2
3
4
5
5
5
5
5
5

之所以结果不是1, 2, 3, 4, 5,是因为匿名函数记录的是循环变量 i 的内存地址,而不是循环变量 i 某一时刻的值

本文结束 感谢阅读