匿名函數和defer
阿新 • • 發佈:2018-08-25
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