golang
Go 语言中使用 defer 的几个场景
简化资源回收,相当于析构函数
在 Go 语言中,没有析构函数,如果需要在实例完成后进行资源回收的情况,可以使用 defer 语句。 defer 是先进后出,这样做很合理,后面的语句会依赖前面的资源,如果先前面的资源先释放了,那后面的语句就没法执行了。 当然, defer 也有一定的开销, 也有为了节省性能而回避使用的 defer 的。 使用示例:
func set(mu *sync.Mutex, i int) { mu.Lock() mu.Unlock() }panic 异常捕获,recover 只能在 defer 语句中使用
使用方法如下:
func main() { defer func() { if r := recover(); r != nil { fmt.Println(r) } }() panic("Error") }修改返回值,适用于特定场景
func doubleSum(a, b int) (sum int) { defer func() { sum *= 2 }() sum = a + b }安全回收资源,即使 panic 抛出异常,recover 也可捕获
不使用 defer 的情况,前面的语句出现异常,后面的语句就没有机会执行。
func set(mu *sync.Mutex, i, v int) { mu.Lock() i := v / 0 // 0 不能做除数,会抛出异常,后面的语句不能被执行 mu.Unlock() }使用 defer 的情况,即使前面出现异常,后面的语句照样可以执行。
func set(mu *sync.Mutex, i, v int) { mu.Lock() i := v / 0 // 0 不能做除数,会抛出异常,后面的语句不能被执行 mu.Unlock() }
文章归档
文章日历
| 2025 年 12 月 | ||||||
|---|---|---|---|---|---|---|
| 日 | 一 | 二 | 三 | 四 | 五 | 六 |
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 | |||
文章标签
- Linux
- Go
- Yii
- 新浪
- CentOS
- PHP
- Git
- WSL
- Composer
- Mac
- 入职
- Bootstrap
- macOS
- UCenter
- 厦门
- 出差
- 长沙
- 湖南卫视
- 微博
- Tengine
- YUI
- 泰国
- pecl
- 优化
- GitLab
- 迁移
- rootless
- 年会
- 生日
- Tengin
- RedHat
- Sphinx
- cygwin
- Windows
- Tmux
- Zsh
- 升级
- MySQL
- sql_mode
- Shadowsockets
- 面向对象
- HTTP
- 状态码
- grep
- unoconv
- PPT
- Nginx
- htpasswd
- golang
最新评论
-
崔亮 于 19-05-23 评论了Tengine 2.2.2 配置 http2 协议出现的坑 -
王媛 于 19-01-31 评论了Yii China 是官方唯一认可的中文社区 -
三杯蛙 于 19-01-24 评论了Go 语言中 json 的操作以及常见问题 -
三杯蛙 于 19-01-24 评论了新浪赴泰国曼谷和芭提雅团建 -
巡洋舰 于 18-09-05 评论了CentOS 安装 PHP7 -
小不点 于 11-03-02 评论了WordPress 如何控制每页显示的条数 -
白领厕工 于 10-12-22 评论了关于 phpMyAdmin 免输入用户名和密码,直接进入管理界面 -
清晨的欣赏 于 10-08-04 评论了PHP 5.4 的新特性 -
易赛官网 于 10-07-27 评论了PHP 5.4 的新特性 -
文秘之家 于 10-07-17 评论了PHP 5.4 的新特性
常用工具
- 时间戳转换
- URL ENCODE/DECODE
- JSON
- 正则测试