使用Golang时遇到的一些坑
1、 【致命】不是所有Panic都能捕获 我们知道Golang给开发人员提供recover()机制,对堆栈异常(panic)进行捕获并自定义其处理逻辑。下面举个例子: 构造一个除0的异常场景: 输出结果: 我们看到程序正常退出,没有异常,说明recover()按照预期捕获到panic异常;但不是所有panic都能通过recover()捕捉到的,比如:并发操作map实例。 构造并发操作map的场景: 输出结果: 以上结果可知,我们不能单纯依靠recover()解决函数内部所有panic异常,应该做到以下几点: a) 通过编写代码校验,防止能预期到的panic,比如:空指针引用的指针判断。 b) 对于无法预期的panic,使用recover()捕获并加以处理。 c) 使用map时,必须要考虑是否存在并发读写场景,存在时,应使用ConcurrentMap组件或自己加sync.RWMutex进行加锁保护。 相关参考: 关于并发读写map导致的panic无法使用recover()捕获,是Go1.6增加的一个特性,https://golang.org/doc/go1.6#runtime; 当然这个并非是唯一一个无法通过recover()捕获的场景,还有可能Go本身的bug,https://github.com/golang/go/issues/21717;这个Bug在Go1.9.2才修复 2、