前言:
有时候我们希望在函数执行结束后执行某些操作,类似于PHP中的构造函数 __destruct 。
在Go中,我们可以使用关键字defer实现此操作,但与PHP有较大差异,我们先看一下代码:
package main
import(
"fmt"
)
func main() {
defer fmt.Println("defer")
fmt.Println("main")
}
执行结果:
main
defer
在函数体内我们还可以使用多个defer关键字
package main
import (
"fmt"
)
func main() {
defer fmt.Println("defer1")
defer fmt.Println("defer2")
defer fmt.Println("defer3")
fmt.Println("main")
}
输出结果:
main
defer3
defer2
defer1
在这里我们发现了,defer关键字的执行顺序刚好与编写顺序相反,原因是defer使用了压栈的方式执行(先进后出)
defer关键字后面也可以执行其他函数
package main
import (
"fmt"
)
func main() {
defer test()
fmt.Println("main")
}
func test() {
fmt.Println("defer")
}
输出结果:
main
defer
需要注意的是,defer与PHP __destruct 函数的不同在于defer在函数体所有代码执行完毕后就马上执行,而无需等待到执行销毁机制前再执行
package main
import (
"fmt"
)
func main() {
test()
fmt.Println("main")
}
func test() {
fmt.Println("test")
defer fmt.Println("defer")
}
输出结果:
test
defer
main
在日常开发中,我们可以使用defer对上锁的资源进行解锁,一般代码编写在上锁代码后,方便阅读理解:
package main
import (
"fmt"
)
func main() {
lock()
defer unlock()
fmt.Println("logic...")
}
func lock() {
fmt.Println("lock")
}
func unlock() {
fmt.Println("unlock")
}
输出结果:
lock
logic...
unlock