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