如果惊慌失措,Golang延后不起作用?

时间:2019-09-05 07:40:58

标签: go

我有以下代码,未执行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$

2 个答案:

答案 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语句的工作方式不同于catchfinally块,但提供相同的功能。

请参见Use of defer in Go

答案 1 :(得分:1)

deferpanic之后将不起作用,因为该控件从未到达该语句,因此它从未被注册。这就像在函数中的return语句之后打印某些内容,基本上是无法访问的代码。