package main
import (
"fmt"
)
var a bool = true
func main() {
defer func(){
fmt.Println("err1:")
}()
if a == true {
fmt.Println("is true")
return
}
defer func(){
fmt.Println("err2:")
}()
}
输出:
is true err1: 可见,return后面的defer没执行 在该网站看到一篇文章,说defer任何时候都会执行,如下:
https://studygolang.com/articles/22646
func CopyFile(dstName, srcName string) (written int64, err error) {
src, err := os.Open(srcName)
if err != nil {
return
}
defer src.Close()
dst, err := os.Create(dstName)
if err != nil {
return
}
defer dst.Close()
return io.Copy(dst, src)
}
src 和 dst 都能及时清理和释放,无论 return 在什么地方执行。
请问如果return后,defer src.Close()真的会执行吗?
有疑问加站长微信联系(非本文作者)

需要先让
defer
语句执行, 之后才能在return
之前执行defer
关键字后的函数 (或方法). 原理我也觉得,return之前的defer才会执行,return后面的defer是不会执行的
不会,defer要写在前面
defer 要先执行注册,return 后会按先进后出的顺序去调用已注册的defer方法
有了defer,看代码的时候也要先读异常处理代码,再看panic,一般来说应该是写panic(throw),再写异常处理</br> go真是特立独行啊!!!
defer的含义是,入栈 return后面的话,还没入,就return了
不会,文章代码
dst, err := os.Create(dstName)
,err != nil 时,dst是nil,根本不需要清理,后面的defer dst.Close()
也不会执行,表达的是一个意思,没有矛盾。原来是这个意思。这样的话,确实符合逻辑
你说的这不是defer机制问题,你这只是语法的问题。defer首先是压栈,带到panic或者return等时,会pop出来执行。你这个例子if err != nil { return } 直接return了 defer不会执行