golang中的defer

defer和匿名函数详解

Posted by John Mactavish on July 5, 2019

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