panic 中断程序
概念说明
panic 表示程序遇到了无法继续执行的严重问题。
触发 panic 后,当前函数会停止正常流程,并开始向上展开调用栈。
普通业务错误应优先返回 error。panic 更适合表示程序员错误、不可恢复状态或初始化阶段的致命问题。
语法/规则
- 使用
panic(value)主动触发 panic。 - 数组越界、空指针解引用等运行时错误也会触发 panic。
- panic 会执行当前 goroutine 中已经注册的
defer。 - 没有被
recover捕获时,程序会打印 panic 信息并退出。 - 不要把 panic 当成普通流程控制。
panic 示例
| |
关键输出:
| |
上面的例子更偏向语法演示。
下面这个场景更能体现 panic 什么时候该用:
| |
这个例子想说明:
- 用户输入错误、参数校验失败,通常返回
error更合适。 - 像“启动必需配置缺失”这种程序根本无法继续运行的情况,才更适合
panic。
常见错误
- 把用户输入错误、校验失败等普通业务问题都写成
panic。 - 以为
panic后面的普通语句还会继续执行,实际当前正常流程会被打断。 - 忘记 panic 只影响当前 goroutine 的调用栈,跨 goroutine 需要在各自内部处理。