go语言PANIC

一 chan
1关闭一个空chan 会panic。
var a c
close(a.i)
2向一个已经close的channel发送数据将导致panic。
但接收一个所有数据都被成功接收的close的channel会立即返回0数值。
所以写完后关闭channel不影响读channel,写方向关闭channel才是安全的。
3.重复关闭chan将导致panic

  • 所以,不主动关闭chan是一个好的选择。
    image.png
  • 其次,在使用channel前要make,避免为空

二 切片
1.访问越界的slice
2.截取包含的实际index越界会panic slice

  • [len(s):len(s)]不会panic
  • [len(s)]panic
  • [>=len(s):更大] panic
  • [i,j] 索引超出字符串范围或者j

三 MAP

  • 向一个nil的map存入元素(map[10] = 10)将导致panic,所以在向map存入数据前需要创建map。
    但range遍历空map不会panic
  • 查找,删除,len和range循环都可以安全工作在nil值上。
    但访问某个元素是否存在不会panic。
  • 并发操作map 会抛出throw异常,无法被recover。

四 函数类型


image.png

五 接口

  1. 调用一个空接口将导致panic
  2. 一个包含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 后,从宕机点退出当前函数后继续执行。

你可能感兴趣的:(go语言PANIC)