Go语言的panic类型
00 分钟
2022-9-2
 

1、数组越界(运行时错误)。

运行结果:
index out of range:索引超出范围(数组越界)

2、空指针异常(运行时错误)。

运行结果:
segmentation violation:内存段异常。

3、类型断言失败(接口转换异常)。

运行结果:
interface conversion: interface {} is string, not int:接口转换,接口是string,不是int。

4、通道为空,通道已关闭

运行结果:
close of nil channel关闭空的通道。
运行结果:
send on closed channel:发送给已关闭的通道。

5、死锁,所有线程睡眠(致命错误)

这一条是致命错误,不属于panic,但是跟panic异常一样,会导致程序挂掉。
运行结果:
fatal error: all goroutines are asleep - deadlock:指明错误,所有线程睡眠,死锁。

6、给空map赋值

运行结果
assignment to entry in nil map:赋值到空的map。

7、致命错误:并发的map写

运行结果
concurrent map writes:并发map写。Go语言中,map只能并发的读,不可以并发的写,如果要在多个线程中对map进行写操作,必须要加锁

8、递归死循环,堆栈溢出(运行时:goroutine堆栈超出限制,致命错误:堆栈溢出)

运行结果
这里出现了递归循环调用,即死循环,因为结构体people重写了官方包的String()方法,而fmt.Sprintf()中调用了String()方法,就出现了又回到p.String()方法,然后又调用fmt.Sprintf()方法,然后又回来,导致死循环,也导致堆栈溢出。
runtime: goroutine stack exceeds 1000000000-byte limit:运行时:goroutine堆栈超出1000000000字节限制fatal error: stack overflow 致命错误:堆栈溢出
这种错误在递归没有出口的时候出现,也就是递归死循环的时候出现
运行结果

map并发加锁


评论