1. 首页
  2. 主题
  3. Go问与答

疑惑return后面的defer到底会不会执行?

taatcc · · 5252 次点击
```go 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:") }() } ``` 输出: <pre> is true err1: 可见,return后面的defer没执行 在该网站看到一篇文章,说defer任何时候都会执行,如下: </pre> ```go 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 在什么地方执行。 ``` <b>请问如果return后,defer src.Close()真的会执行吗?</b>
![image.png](https://static.studygolang.com/190905/59de031c8c3bcc0d694bd60a3928074a.png) ??? 没有这样的操作
#9
更多评论
需要先让 `defer` 语句执行, 之后才能在 `return` 之前执行 `defer` 关键字后的函数 (或方法). [原理](https://draveness.me/golang/keyword/golang-defer.html)
#1
我也觉得,return之前的defer才会执行,return后面的defer是不会执行的
#2

用户登录

没有账号?注册

今日阅读排行

    加载中

一周阅读排行

    加载中