Go runtime

Go panic

大多数编程语言都提供了异常处理机制,恰恰相反,Go延续了C语言的风格,并未提供异常处理机制。但在Go中,提供了panic异常,从某种意义上说,它也非常接近其他语言的异常处理。

Go语言在编译期间就能捕获大量异常,但是有些异常只能发生在运行期间,比如运行期间的除以0的异常,数组越界错误等。

除了程序本身的问题导致panic异常外,也可以直接在程序里调用panic函数引发panic异常。panic函数原型如下:

1
func panic(v interface{})

当我们直接调用panic函数时就会引发程序panic异常。如下面例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package main

import "fmt"

func f(x int) {
fmt.Printf("f(%d)\n", x+0/x) // 当参数为 0 时,引发 panic 异常
defer fmt.Printf("%d\n", x)
f(x - 1)
}

func main() {
f(3)
fmt.Println("end")
}

当程序panic异常发生时,程序会中断运行,并执行panic异常中的所有deferred函数。例如,引发除0错误时,此时外层调用f(0)的函数f(1)里会执行defer,当然,panic异常会向外传递,知道所有的deferred函数全部执行完。

Go defer

Go语言的 defer 语句会将其后面跟随的语句进行延迟处理,在 defer 归属的函数即将返回时,将延迟处理的语句按 defer 的逆序进行执行,也就是说,先被 defer 的语句最后被执行,最后被 defer 的语句,最先被执行。延迟语句常常用来释放资源,如下所示。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!