go中发生panic的场景:
- 数组/切片越界
- 空指针调用。比如访问一个 nil 结构体指针的成员
- 过早关闭 HTTP 响应体
- 除以 0
- 向已经关闭的 channel 发送消息
- 重复关闭 channel
- 关闭未初始化的 channel
- 未初始化 map。注意访问 map 不存在的 key 不会 panic,而是返回 map 类型对应的零值,但是不能直接赋值
- 跨协程的 panic 处理
- sync 计数为负数。
var wg sync.WaitGroup;wg.Add(1) ;wg.Done() ;wg.Done() // 再减一次,计数 = -1,会触发 panic
- 类型断言不匹配。
var a interface{} = 1; fmt.Println(a.(string))
会 panic,建议用s,ok := a.(string)