// 规则一,当defer被声明时,其参数就会被实时解析
package main
import "fmt"
func main() {
var i int = 1
defer fmt.Println("result =>", func() int { return i * 2 }())
i++
// 输出: result => 2 (而不是 4)
}
// 规则二 defer执行顺序为先进后出
package main
import "fmt"
func main() {
defer fmt.Print(" !!! ")
defer fmt.Print(" world ")
fmt.Print(" hello ")
}
//输出: hello world !!!
func fun1() (i int)
package main
import (
"fmt"
)
func main() {
fmt.Println("=========================")
fmt.Println("return:", fun1())
fmt.Println("=========================")
fmt.Println("return:", fun2())
fmt.Println("=========================")
fmt.Println("return:", fun3())
fmt.Println("=========================")
fmt.Println("return:", fun4())
}
func fun1() (i int) {
defer func() {
i++
fmt.Println("defer2:", i) // 打印结果为 defer2: 2
}()
// 规则二 defer执行顺序为先进后出
defer func() {
i++
fmt.Println("defer1:", i) // 打印结果为 defer1: 1
}()
// 规则三 defer可以读取有名返回值(函数指定了返回参数名)
return 0 //这里实际结果为2。如果是return 100呢
}
func fun2() int {
var i int
defer func() {
i++
fmt.Println("defer2:", i) // 打印结果为 defer2: 2
}()
defer func() {
i++
fmt.Println("defer1:", i) // 打印结果为 defer1: 1
}()
return i
}
func fun3() (r int) {
t := 5
defer func() {
t = t + 5
fmt.Println(t)
}()
return t
}
func fun4() int {
i := 8
// 规则一 当defer被声明时,其参数就会被实时解析
defer func(i int) {
i = 99
fmt.Println(i)
}(i)
i = 19
return i
}