go 程序會觸發 panic 以處理不可恢復錯誤,例如:內置函數調用錯誤(如 make、new、append)用戶自定義 panic 調用堆棧溢出內存分配器耗盡內存協程致命退出關閉無等待 goroutine 的 channel
Panic 在 Go 中的觸發時機
當 Go 程序遇到不可恢復的錯誤時,它會觸發 panic。通常情況下,panic 會在以下兩種情形觸發:
1. 內置函數調用時的錯誤
當內置函數(例如 make
、new
、append
)在執行時遇到錯誤,它們會觸發 panic。例如:
<code class="go">// 嘗試創建超過最大長度的切片導致 panic mySlice := make([]int, 1e100)</code>
登錄后復制
2. 用戶自定義的 panic 調用
用戶可以通過調用 panic
函數顯式觸發 panic。通常情況下,這是為了指示一個錯誤,程序在此錯誤下無法繼續執行。例如:
<code class="go">// 缺少必要參數導致 panic func myFunc(a, b int) { if a == 0 { panic("參數 a 不能為空") } }</code>
登錄后復制
觸發 Panic 的其他情況
除了上述常見情況外,還有一些其他情況可能會觸發 panic:
當堆棧溢出時(例如無限遞歸)
當分配器耗盡內存時
當一個協程由于致命錯誤而退出時
當一個 channel 被關閉,并且沒有 goroutine 在等待它時
處理 Panic
當發生 panic 時,Go 程序會停止執行并打印一個堆棧跟蹤。可以通過實現 recover
函數來處理 panic。此函數可以從 panic 中恢復并繼續執行,盡管在某些情況下可能無法恢復。