一 chan
1关闭一个空chan 会panic。
var a c
close(a.i)
2向一个已经close的channel发送数据将导致panic。
但接收一个所有数据都被成功接收的close的channel会立即返回0数值。
所以写完后关闭channel不影响读channel,写方向关闭channel才是安全的。
3.重复关闭chan将导致panic
-
所以,不主动关闭chan是一个好的选择。
- 其次,在使用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存入数据前需要创建map。
但range遍历空map不会panic - 查找,删除,len和range循环都可以安全工作在nil值上。
但访问某个元素是否存在不会panic。 - 并发操作map 会抛出throw异常,无法被recover。
四 函数类型
五 接口
- 调用一个空接口将导致panic
- 一个包含nil指针的接口不是nil接口(7.5.1)
六 mutex
unlock未加锁或已经解锁的mutex
七 指针
- 直接使用空指针会panic
八 其他
- 被除整数为0,panic
- 接口转换异常
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)
}
避免接口转换异常,优雅的接口转换方式:即使是个nil接口,也不会panic
t, ok := i.(T)
详情:https://www.cnblogs.com/saryli/p/13364224.html
九 调用nil指针的方法不会panic
十 panic 的捕获,recover
有 panic 没 recover,程序宕机。
有 panic 也有 recover,程序不会宕机,执行完对应的 defer 后,从宕机点退出当前函数后继续执行。