我有以下代码,未执行defer。
如果我们在恐慌之后放工作,会不会推迟工作?
package main
import (
"fmt"
)
func main() {
fmt.Println("begining of main")
panic("stop here")
defer fmt.Println("end of main")
}
nghiatran@nghiatran-VB:~/go/src/defer$ go run main.go
begining of main
panic: stop here
goroutine 1 [running]:
main.main()
/home/nghiatran/go/src/defer/main.go:9 +0x96
exit status 2
nghiatran@nghiatran-VB:~/go/src/defer$
答案 0 :(得分:4)
语句顺序错误。延迟将函数调用压入堆栈。在函数执行结束时,以相反的顺序执行堆栈调用并执行。功能是否紧急无关紧要。
您需要先按功能调用,然后再紧急操作。
package main
import (
"fmt"
)
func main() {
defer fmt.Println("end of main") // push the call to the stack
fmt.Println("begining of main")
panic("stop here")
// the deffered functions are called as if they where here
}
defer
语句的工作方式不同于catch
和finally
块,但提供相同的功能。
答案 1 :(得分:1)
defer
在panic
之后将不起作用,因为该控件从未到达该语句,因此它从未被注册。这就像在函数中的return语句之后打印某些内容,基本上是无法访问的代码。