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
毫无疑问的是下面的打印先执行,但为什么结果与上面的函数结果不同
因为:匿名函数在被调用之前就已经发生了传参,而那时的参数已经被赋值,而且匿名函数没有被调用执行而已,最后整个函数快要结果时,匿名函数被调用,所以才会发生执行结果的不同
原文地址:https://www.cnblogs.com/baylorqu/p/9533132.html
时间: 2024-10-07 05:18:50