标签:run 调用 控制器 消失 user span 绝对路径 err index
举个栗子
package main func main() { s1 := []int{0, 1, 2, 3, 4} e5 := s1[5] _ = e5 }
运行上面的代码,会抛出panic
panic: runtime error: index out of range goroutine 1 [running]: //Id为1的goroutine在此panic被引发时正在运行 main.main() /Users/haolin/GeekTime/Golang_Puzzlers/src/puzzlers/article19/q0/demo47.go:5 +0x3d //此行代码在其所属源码文件中的行数,以及源码文件的绝对路径, +03d是计数偏移量,用处不大。 exit status 2 //以退出状态码2结束运行,一般状态不为0时表示程序非正常退出
从Painc被引发到程序终止运行的大致过程是怎样的?
某个函数中的某行代码引发了一个panic后,初始的panic详情会被建立起来,并且该程序的控制器会立即从此行代码转移到调用其所属函数的那行代码上(调用栈中的上一级),此行代码所属函数的执行随即终止。紧接着,控制权并不会在此有片刻停留,它又会立即转移至上一级的调用代码处,反方向传播直至最外层函数(go函数,对于主goroutine来说就是main函数)。但是控制器也不会停留在那里,而是被Go语言运行时系统收回。随后程序奔溃并终止运行,承载程序这次运行的进程也会随之死亡并消失。与此同时,在这个控制器传播过程中,panic详情会积累和完善,并在程序终止之前打印出来。
//main函数调用了caller1函数,caller1函数调用了caller2函数 goroutine 1 [running]: main.caller2() /Users/haolin/GeekTime/Golang_Puzzlers/src/puzzlers/article19/q1/demo48.go:22 +0x91 main.caller1() /Users/haolin/GeekTime/Golang_Puzzlers/src/puzzlers/article19/q1/demo48.go:15 +0x66 main.main() /Users/haolin/GeekTime/Golang_Puzzlers/src/puzzlers/article19/q1/demo48.go:9 +0x66 exit status 2
标签:run 调用 控制器 消失 user span 绝对路径 err index
原文地址:https://www.cnblogs.com/yuxiaoba/p/9813605.html