版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yujuan110/article/details/83177418
package main
import "fmt"
func main(){
fmt.Println("enter in main")
defer test("test defer:")()//注意这里有括号!
//如果没有括号,入口函数会在函数退出时执行
//而出口函数将不会执行
//括号表示调用
var i int=2;
i++;
fmt.Println("exit in main")
return;
}
func test(str string) func(){
fmt.Println(str,"enter")
return func(){fmt.Println(str,"exit")}
}
输出结果
enter in main
test defer: enter
exit in main
test defer: exit
由于逆函数可以看到函数外的变量,所以可以通过defer改变结果值,如下:
func double(x int) (result int){
defer func(){fmt.Printf("double(%d)=%d",x,result)}()
return x+x
}
func main(){
double(4)
}
由于defer不到函数的最后是不会执行的。如下代码,虽然调用了f.Close(),但是在一次循环之后并不会被执行。
for _,filename:=range filenames{
f,err:=os.Open(filename)
if err !=nil{
return err
}
defer f.Close()//可能会用尽文件描述符
//处理文件f
//...
如何解决?
for _,filename :=range filenames{
if err:=doFile(filename):err!=nil{
return err
}
}
func doFile(filename string) error{
f,err=os.Open(filename)
if err!=nil{
return err
}
defer f.Close()
}