defer使用
defer使用
上午碰到了这么一个问题 for 循环中使用defer
i := 0
defer fmt.Println("a", i)
for ; i < 3; i++ {
defer fmt.Println("b", i)
}
defer fmt.Println("c", i)
i = 100
defer fmt.Println("d", i)
a c d对应的输出都没问题 for循环中的输出有点懵逼了,当时和这么一段代码弄混了
i := 0
defer fmt.Println("a", i)
for ; i < 3; i++ {
// defer fmt.Println("b", i)
go func() {
fmt.Println("bb", i)
}()
}
defer fmt.Println("c", i)
i = 100
defer fmt.Println("d", i)
我当时认为for中defer的输出会是3 3 3 ,当时不知道怎想的。。。
下午有空的时候抽时间运行了下代码 1 2 3 有点蒙 ,我当时以为是for循环编译的问题,吃饭的时候仔细想了想, 吃完饭输出了循环内i的地址,一样。有些明白了…
这个地方 我把字符串的使用和闭包参数的传递搞混了 一个是复制 一个是引用 for在循环添加defer的时候已经吧i的值赋值给defer i,在defer列表中i已经已值存储,非地址的引用 第二段代码for 循环中的i是地址的引用 它的输出是不确定的
nums := [][]int{{8}, {2}, {1}}
nums[2] = []int{0}
for k, v := range nums {
defer fmt.Println("f", v)
defer fmt.Println("ff", nums[k])
fmt.Println("fff", v)
go func() {
fmt.Println("fffff", v)
}()
}
nums[2] = []int{0}
time.Sleep(1*time.Second)
输出
fff [8]
fff [2]
fff [0]
fffff [0]
fffff [0]
fffff [0]
ff [0]
f [0]
ff [2]
f [2]
ff [8]
f [8]