一 chan
1關(guān)閉一個空chan 會panic云矫。
var a c
close(a.i)
2向一個已經(jīng)close的channel發(fā)送數(shù)據(jù)將導致panic秉宿。
但接收一個所有數(shù)據(jù)都被成功接收的close的channel會立即返回0數(shù)值糙箍。
所以寫完后關(guān)閉channel不影響讀channel臀叙,寫方向關(guān)閉channel才是安全的票髓。
3.重復關(guān)閉chan將導致panic
-
所以珍策,不主動關(guān)閉chan是一個好的選擇。
image.png - 其次吭狡,在使用channel前要make尖殃,避免為空
二 切片
1.訪問越界的slice
2.截取包含的實際index越界會panic slice
- [len(s):len(s)]不會panic
- [<len(s):>len(s)]panic
- [>=len(s):更大] panic
- [i,j] 索引超出字符串范圍或者j<i將panic
三 MAP
- 向一個nil的map存入元素(map[10] = 10)將導致panic,所以在向map存入數(shù)據(jù)前需要創(chuàng)建map划煮。
但range遍歷空map不會panic - 查找送丰,刪除,len和range循環(huán)都可以安全工作在nil值上弛秋。
但訪問某個元素是否存在不會panic蚪战。 - 并發(fā)操作map 會拋出throw異常,無法被recover铐懊。
四 函數(shù)類型
image.png
五 接口
- 調(diào)用一個空接口將導致panic
- 一個包含nil指針的接口不是nil接口(7.5.1)
六 mutex
unlock未加鎖或已經(jīng)解鎖的mutex
七 指針
- 直接使用空指針會panic
八 其他
- 被除整數(shù)為0邀桑,panic
- 接口轉(zhuǎn)換異常
package main
import "fmt"
func main() {
add(20, 18)
add(1, "hello")
}
func add(a, b interface{}) {
i := a.(int)
j := b.(int)
fmt.Println(i+j)
}
避免接口轉(zhuǎn)換異常,優(yōu)雅的接口轉(zhuǎn)換方式:即使是個nil接口科乎,也不會panic
t, ok := i.(T)
詳情:https://www.cnblogs.com/saryli/p/13364224.html
九 調(diào)用nil指針的方法不會panic
十 panic 的捕獲壁畸,recover
有 panic 沒 recover,程序宕機茅茂。
有 panic 也有 recover捏萍,程序不會宕機,執(zhí)行完對應(yīng)的 defer 后空闲,從宕機點退出當前函數(shù)后繼續(xù)執(zhí)行令杈。