关于golang的延后执行defer
Contents
[NOTE] Updated January 1, 0001. This article may have outdated content or subject matter.
defer:在函数执行到最后时,再进行调用声明了defer的函数。
DEMO:
package main
import (
"fmt"
)
func defer_first(){
fmt.Println("Hi ! I'm first defer");
}
func dataOp(data1 float32 ,data2 float32)(float32,float32){
return data1+data2,data1*data2
}
//只有一个defer 的情景
func main() {
var x float32
var y float32
x=1.1
y=2.2
defer defer_first()
_,mutied:=dataOp(x,y)
fmt.Printf("%f\n",mutied);
}
以上demo输出为:
2.420000
Hi ! I'm first defer
以上demo可以看出defer是最后才会调用的,也就是在函数main退出前调用的。
所以,这种场景最实用的地方应该是 在 文件I/O里面 如果每次文件Close操作都需要关闭相应的资源,次数一多,极有可能造成资源泄露的问题。调用了defer之后只要在一个函数结束前去延时调用资源Close函数就可以了。
第二个Demo
package main
import (
"fmt"
)
func defer_first(){
fmt.Println("Hi ! I'm first defer");
}
func defer_second(){
fmt.Println("Hi! I'am second defer")
}
func dataOp(data1 float32 ,data2 float32)(float32,float32){
return data1+data2,data1*data2
}
//两个defer 的情景
func main() {
var x float32
var y float32
x=1.1
y=2.2
defer defer_first()
defer defer_second()
_,mutied:=dataOp(x,y)
fmt.Printf("%f\n",mutied);
}
输出为:
2.420000
Hi! I'am second defer
Hi ! I'm first defer
由以上demo可知:Golang 的defer操作时采用后进先出(Stack?)模式的,后定义的second defer 反而在first之前输出了。
以上 关于 Golang defer 的实验。
Author scnace
LastMod 0001-01-01