defer的三个特性
声明defer时函数的参数就已经被解析
func a() {
i := 0
defer fmt.Println(i)
i++
return //输出为0
}
但是只有参数被解析,函数内部的参数在函数执行时解析
定义多个defer时,按先定义后执行的顺序依次调用
func b() {
for i := 0; i < 4; i++ {
defer fmt.Print(i)
} //依次输出3,2,1,0 }
defer可以读取有名返回值
func c() (i int) {
defer func() { i++ }()
return 1
} defer代码块的作用域仍然在函数之内。return不是原子操作,它先将return后面的1赋值给有名返回值i,然后执行defer后的函数,最后才返回i。在这个例子中,i被defer后的函数修改了,返回值不再是return后的1,值得注意。
defer和匿名函数
匿名函数后面的括号表示提供给匿名函数的参数值,可以只是一个空括号。
func main() {
whatever:=[5]int{1,2,3,4,5}
for i := range whatever {
defer func(n int) { fmt. Println(n) }(i) //i赋值给匿名函数的n int } //因此输出4,3,2,1,0 }
@end
```
最后附上GitHub:https://github.com/gonearewe