go语言的defer
- go语言中defer可以完成延迟功能,当前函数执行完成后再执行defer的代码块;
- defer常用于关闭文件,关闭数据库等;
- 代码中如果有defer, 代码就可能不是按照顺序执行的,即使defer写在最前面,也可能会最后执行;("可能"用于多个defer的情况)
- 多重defer采用栈结构执行,即先进后出,先产生的defer后执行;
- defer与return连用时,要把return理解成2条执行结合(不是原子指令),一个指令是给返回值赋值,另一个指令是返回跳出函数;
- defer和return整体执行顺序: 1.先给返回值赋值–>2.执行defer–>3.返回跳出函数,如果没有定义返回值接收变量,执行defer时返回已有赋值;
- 如果代码中有os.Exit(),则程序会提前结束,且defer不会被执行到;
package main
import (
"fmt"
"os"
)
func main() {
testDefer1()
fmt.Println("testDefer2: ", testDefer2())
fmt.Println("testDefer3: ", testDefer3())
fmt.Println("testDefer5: ", testDefer5())
fmt.Println("testDefer6: ", testDefer6())
testDefer4()
}
func testDefer1() {
fmt.Println("打开A")
defer func() {
fmt.Println("关闭A")
}()
fmt.Println("打开B")
defer func() {
fmt.Println("关闭B")
}()
fmt.Println("打开C")
defer func() {
fmt.Println("关闭C")
}()
fmt.Println("打开D")
defer func() {
fmt.Println("关闭D")
}()
}
func testDefer2() int {
i := 0
defer func() {
i += 2
}()
return i
}
func testDefer3() (i int) {
i = 0
defer func() {
i += 2
}()
return i
}
func testDefer4() {
fmt.Println("打开A")
defer func() {
fmt.Println("关闭A")
}()
fmt.Println("打开B")
defer func() {
fmt.Println("关闭B")
}()
fmt.Println("打开C")
defer func() {
fmt.Println("关闭C")
}()
os.Exit(0)
}
func testDefer5() int{
i := 0
defer func() {
n := i + 1
fmt.Println("n的值是: ", n)
}()
return 1
}
func testDefer6() (n int) {
i := 0
defer func() {
n = i + 1
}()
return n
}