defer后面紧跟的一条语句会被压入独立的栈中,当程序段结束后会依次弹栈执行。
注意:当defer语句压入栈中时,也会将相关的变量同时拷贝入栈(不会改变执行结果),看个例子,如下
func sum(n int) int{
var n = 10
defer fmt.Println(“befor”,n) //后输出这句—befor10
n = n + 1
fmt.Println(“after”,n) //先输出这句—after11
}
defer主要是为了延时释放资源,防止释放步骤的遗忘。程序员不用为在什么时机释放资源而担心,也不用担心遗漏释放动作。看个示例:
func test(){
file = openfile(文件名)
defer file.close()
//other code
connect = openDatabase()
defer connect.close()
//other code
}