defer:在函数执行到最后时,再进行调用声明了defer的函数。
DEMO:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
 | 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
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
 | 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);   }
 | 
输出为:
| 1 2 3
 | 2.420000 Hi! I'am second defer Hi ! I'm first defer
 | 
由以上demo可知:Golang 的defer操作时采用后进先出(Stack?)模式的,后定义的second defer 反而在first之前输出了。
以上   关于  Golang defer 的实验。