码迷,mamicode.com
首页 > 其他好文 > 详细

匿名函数和defer

时间:2018-08-25 14:32:42      阅读:268      评论:0      收藏:0      [点我收藏+]

标签:表达   JetBrains   结果   pre   pac   use   some   imp   eve   

package main

import "fmt"

func main()  {
   a := 10
   b := 20
   defer func() {
      fmt.Printf("a = %d, b = %d\n", a, b)
   }()

   a = 111
   b = 222
   fmt.Printf("a = %d, b = %d\n", a, b)
}

执行后得到以下的结果,需要注意以下:

1、defer的匿名函数是在整个函数执行结束前的一瞬间执行的,即延时执行

2、因为defer的匿名函数可以捕获与它在同作用域的其它变量和常量,即a和b的值在匿名函数下面的表达式中也发生了变化,所以整个结果都没有看到10或者20

GOROOT=C:\Go #gosetup
GOPATH=E:\go\develop #gosetup
C:\Go\bin\go.exe build -i -o C:\Users\baylor\AppData\Local\Temp\___go_build_defer_go.exe E:/awesomeProject01/defer和匿名函数结合使用.go #gosetup
"C:\Program Files\JetBrains\GoLand 2018.1.5\bin\runnerw.exe" C:\Users\baylor\AppData\Local\Temp\___go_build_defer_go.exe #gosetup
a = 111, b = 222
a = 111, b = 222

但是当此匿名函数发生了调用,那情况就不一样了

package main

import "fmt"

func main() {
    a := 10
    b := 20
    defer func(a, b int) {
        fmt.Printf("a = %d, b = %d\n", a, b)
    }(a, b)    《-----这里发生了传参
    a = 111
    b = 222
    fmt.Printf("a = %d, b = %d\n", a, b)
}

那么它的结果就是

GOROOT=C:\Go #gosetup
GOPATH=E:\go\develop #gosetup
C:\Go\bin\go.exe build -i -o C:\Users\baylor\AppData\Local\Temp\___go_build_defer_go.exe E:/awesomeProject01/defer和匿名函数结合使用.go #gosetup
"C:\Program Files\JetBrains\GoLand 2018.1.5\bin\runnerw.exe" C:\Users\baylor\AppData\Local\Temp\___go_build_defer_go.exe #gosetup
a = 111, b = 222
a = 10, b = 20

毫无疑问的是下面的打印先执行,但为什么结果与上面的函数结果不同

因为:匿名函数在被调用之前就已经发生了传参,而那时的参数已经被赋值,而且匿名函数没有被调用执行而已,最后整个函数快要结果时,匿名函数被调用,所以才会发生执行结果的不同

匿名函数和defer

标签:表达   JetBrains   结果   pre   pac   use   some   imp   eve   

原文地址:https://www.cnblogs.com/baylorqu/p/9533132.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!