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






