1. 程式人生 > >匿名函數和defer

匿名函數和defer

class -- 什麽 延時 oca pat port project 註意

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