程式異常被叫做panic,直譯為執行時恐慌
當panic被丟擲異常後,如果我們沒有在程式中新增任何保護措施的話,程式就會列印出panic的詳細情況之後,終止執行
panic: runtime error: index out of range
goroutine 1 [running]:
main.main()
d:/go_workspace/golang_puzzlers/src/puzzlers/article19/q0/demo47.go:5 +0x11
這份異常的第乙個資訊是panic: runtime error: index out of range
其中的runtime error
的含義是,這是乙個runtime**中丟擲的panic,在這個panic中,包含了乙個runtime.error介面型別的值。runtime.error介面內嵌了error介面並做了一點擴充套件
此外,panic 詳情中一般還會包含與它的引發原因有關的 goroutine 的**執行資訊。正如前述詳情中的「goroutine 1 [running]」,它表示有乙個 id 為1,這裡的id並不重要,因為它只是go語言執行時系統內部給與的乙個goroutine編號。
「main.main()」表明了這個 goroutine 包裝的函式就是命令原始碼檔案中的那個函式,也就是說這裡的 goroutine 正是主 goroutine。再下面的一行,指出的就是這個 goroutine 中的哪一行**在此 panic 被引發時正在執行。
最後一行+0x3d代表的是:此行**相對於其所屬函式的入口程式計數偏移量。不過,一般情況下它的用處並不大。
「exit status 2」表明我的這個程式是以退出狀態碼結束執行的。在大多數作業系統中,只要退出狀態碼不是,都意味著程式執行的非正常結束。在 go 語言中,因 panic 導致程式結束執行的退出狀態碼一般都會是。
panic 被引發到程式終止執行的大致過程
某個函式中的某行**有意或無意地引發了乙個 panic。這時,初始的 panic 詳情會被建立起來,並且該程式的控制權會立即從此行**轉移至呼叫其所屬函式的那行**上,也就是呼叫棧中的上一級。
這也意味著,此行**所屬函式的執行隨即終止。緊接著,控制權並不會在此有片刻停留,它又會立即轉移至再上一級的呼叫**處。控制權如此一級一級地沿著呼叫棧的反方向傳播至頂端,也就是我們編寫的最外層函式那裡。
這裡的最外層函式指的是函式,對於主 goroutine 來說就是函式。但是控制權也不會停留在那裡,而是被 go 語言執行時系統收回。
隨後,程式崩潰並終止執行,承載程式這次執行的程序也會隨之死亡並消失。與此同時,在這個控制權傳播的過程中,panic 詳情會被逐漸地積累和完善,並會在程式終止之前被列印出來。
go語言宕機(panic) 程式終止執行
宕機不是一件很好的事情,可能造成體驗停止 服務中斷,就像沒有人希望在取錢時遇到 atm 機藍屏一樣。但是,如果在損失發生時,程式沒有因為宕機而停止,那麼使用者將會付出更大的代價,這種代價可以是金錢 時間甚至生命。因此,宕機有時是一種合理的止損方法。go 語言可以在程式中手動觸發宕機,讓程式崩潰,這樣...
Go語言init函式詳解
go init函式詳解 init 函式會在每個包完成初始化後自動執行,並且執行優先順序比main函式高。init 函式通常被用來 包的初始化 為了使用匯入的包,首先必須將其初始化。初始化總是以單執行緒執行,並且按照包的依賴關係順序執行。hleufd這通過golang的執行時系統控制,如下圖所示 in...
go語言 函式引數傳遞詳解
引數傳遞是指在程式的傳遞過程中,實際引數就會將引數值傳遞給相應的形式引數,然後在函式中實現對資料處理和返回的過程。比較常見的引數傳遞有 值傳遞,按位址傳遞引數或者按陣列傳遞引數.1 常規傳遞 使用普通變數作為函式引數的時候,在傳遞引數時只是對變數值的拷貝,即將實參的值複製給變參,當函式對變參進行處理...