This question already has answers here:
Use of defer in Go

(6个答案)


去年关闭。




据我所知,defer通常用于关闭或释放资源。
并且在代码块(函数)中使用defer FUNC ()可以确保FUNC ()在此块(函数)返回任何错误或该块(函数)出现紧急情况时调用。

因此-如何解释此代码中defer的行为:(Example):
package main
import (
  "fmt"
  "errors"
)
func test() error {
  err := errors.New("some error")
  return err
}
func main() {
  if err := test(); err!=nil {
    fmt.Println("ERROR EXIT")
    return
  }
  defer fmt.Println("DEFER EXIT")
  fmt.Println("NORMAL EXIT")
}

我希望看到这个:
ERROR EXIT
DEFER EXIT

但是知道了:
ERROR EXIT

我哪里错了?

最佳答案

您可以在执行defer语句之前,可以将fmt.Println()调用“排队”之前从主函数返回。

更改为:

defer fmt.Println("DEFER EXIT")
if err := test(); err != nil {
    fmt.Println("ERROR EXIT")
    return
}
fmt.Println("NORMAL EXIT")

然后输出将是(在Go Playground上尝试):
ERROR EXIT
DEFER EXIT

关于go - 请在golang中说明DEFER的行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55829756/

10-13 05:36