Written by
hanhan
on
on
Go defer的陷阱
起因是,今晚公司的内部分享中讲到了go defer的问题,引起了很多人的争讨。用事实说话,我整理了下比较容易出困惑的点。
package main
import (
"fmt"
)
func main() {
res := test_A()
fmt.Println(res)
test_B()
test_C()
fmt.Println("Over.")
}
func test_A() []int{
// 这里证明了:遇到defer时先压入变量的值到list中,return时再执行。这里变量的值是指针。
s := []int {1,2,3}
defer fmt.Println(s)
s[0] = 4
return s
}
func test_B() {
// 这里证明了:压入的defer list其实是stack。
for i:=0; i<5; i++ {
defer fmt.Println("In test B: ",i)
}
}
func test_C() {
// 闭包只有在调用时,才执行内部表达式。 用defer时还是写的易读些吧,别弄成看笔试题一样。
for j:=0; j<5; j++ {
defer func() {
fmt.Println("In test C: ", j)
}()
}
}