一、错误处理机制
Go 语言以结果多值返回方式处理错误,函数或者方法最后一个返回值作为错误类型。
调用时根据错误值判断是否正常
1. error 类型及其意义
Go 语言通过内置的 error 类型实现错误处理,它是一个接口
实现 error 的类型都可以作为错误类型返回,框架会使用 Error()方法打印错误信息。
任意类型只要实现该接口就表示一个错误
2. if err != nil 检查错误
if 语句常用于判断函数调用是否发生错误
3. 自定义错误类型
可自定义错误类型保存更多信息,自定义错误能更好表达错误场景,修正错误也更方便。
调用时可以转换回来
二、defer 处理资源释放问题
Go 语言中的 defer 语句会将函数执行推迟到外层函数返回之前。
1. defer 的执行规则与特点
defer 延迟调用遵循 FILO 规则。
defer 语句中的变量在定义时求值(输出是 1,不是 2。)
2. defer 释放资源
defer 经常用于释放资源,不管 process 返回与否,都能保证文件关闭。
3. defer 经典案例
读取文件内容的示例,输出完内容后,defer 确保文件正确关闭。
三、panic 和 recover
panic 用于程序未能处理的错误,recover 可以让 panic 跳出的 goroutine 恢复,防止整个程序崩溃。
1. panic、defer 和 recover 的关系
- panic 会导致当前 goroutine 立即中止执行,但 defer 保证执行
- recover 可以捕获 panic,从而影响应用恢复
2. recover 捕获 panic
recover 只在 defer 内调用时有效
3. panic 应用场景
不希望看到 panic,但它也有合理应用场景
四、日志的最佳实践
log 包实现日志收集,支持输出到文件,网络等地方。
1. log 包的基本使用
导入 log 包并设置输出位置
2. 设置日志级别,控制日志输出
log 级别包含 Debug、Info、Warning、Error、Fatal 等。
Fatal 会在写入日志后调用 os.Exit(1)。
3. 将日志写入文件,按文件大小切分
默认日志只输出到 stderr,可以写入文件,超过文件限制后,将日志保存到 xx.log.1。