2022-10-29:go语言中的defer能非常方便地处理资源释放问题,rust语言里如何实现defer功能呢?
2023-06-13 09:14:13 时间
2022-10-29:go语言中的defer能非常方便地处理资源释放问题,rust语言里如何实现defer功能呢?
答案2022-10-29:
rust里有时候你也必须用defer,别说是设计上的问题,因为这种情况你肯定会遇到。
有些时候第三方的结构体,析构函数是不满足需求的,但你也不可能直接修改源码。
第三方的结构体是无法直接实现Drop的,因此只能另外定义结构体来包裹第三方的结构体,然后实现drop,这样就能实现defer功能。这是装饰器模式。
现在已经有现成的轮子,直接用就行。轮子有scopeguard和xjbutil。
scopeguard案例代码如下:
extern crate scopeguard;
struct AA {
a: i32,
b: i32,
}
fn main() {
println!("scopeguard");
let mut a = AA { a: 1, b: 2 };
println!("外部1----{:p}", &(a));
println!("外部1----{:p}", &(a.a));
println!("外部1----{}", a.a);
let mut a = scopeguard::guard(&mut a, |a| {
a.a = 13;
println!("内部1----{:p}", &a);
println!("内部1----{:p}", &a.a);
println!("内部1----{}", a.a);
});
//let mut a = a;
let mut a = scopeguard::guard(&mut a, |a| {
a.a = 14;
println!("内部2----{:p}", &a);
println!("内部2----{:p}", &a.a);
println!("内部2----{}", a.a);
});
//let mut a = a;
a.a = 2;
println!("外部2----{:p}", &a);
println!("外部2----{:p}", &a.a);
println!("外部2----{}", a.a);
let mut a = scopeguard::guard(&mut a, |a| {
a.a = 15;
println!("内部3----{:p}", &a);
println!("内部3----{:p}", &a.a);
println!("内部3----{}", a.a);
});
//let mut a = a;
println!("外部3----{:p}", &(a));
println!("外部3----{:p}", &(a.a));
println!("外部3----{}", a.a);
}
xjbutil案例代码如下:
use xjbutil::defer;
struct AA {
a: i32,
b: i32,
}
fn main() {
println!("xjbutil");
let mut a = AA { a: 1, b: 2 };
println!("外部0----{:p}", &(a));
println!("外部0----{:p}", &(a.a));
println!("外部0----{}", a.a);
let a = &mut a;
println!("外部1----{:p}", &(a));
println!("外部1----{:p}", &(a.a));
println!("外部1----{}", a.a);
defer!(
|mut aa| {
aa.a = 13;
println!("内部1----{:p}", &aa);
println!("内部1----{:p}", &aa.a);
println!("内部1----{}", aa.a);
},
a
);
defer!(
|mut a| {
a.a = 14;
println!("内部2----{:p}", &a);
println!("内部2----{:p}", &a.a);
println!("内部2----{}", a.a);
},
a
);
a.a = 2;
println!("外部2----{:p}", &a);
println!("外部2----{:p}", &a.a);
println!("外部2----{}", a.a);
defer!(
|mut a| {
a.a = 15;
println!("内部3----{:p}", &a);
println!("内部3----{:p}", &a.a);
println!("内部3----{}", a.a);
},
a
);
println!("外部3----{:p}", &(a));
println!("外部3----{:p}", &(a.a));
println!("外部3----{}", a.a);
}
结果如下:
相关文章
- Go语言之指针(二十二)
- Go并发聚合请求利器——singleflight的源码详解
- Go语言中常见100问题-#9 Being confused about when to use generics
- Go 1.18 新增三大功能之一“模糊测试”使用方式
- 「Go工具箱」将文件大小转换成Kb、Mb、Gb就用这个库:go-humanize
- Go error 源码解读、错误处理的优化与最佳实践
- Go语言——反射
- Go-包管理-go get(一)
- Go-包管理-go get(二)
- Go Mutex:保护并发访问共享资源的利器
- Go语言文件锁操作
- Go_ go mod 命令解决墙的问题详解编程语言
- Linux上构建Go开发环境(linux安装go环境)
- 环境Go 编译 在 Linux 环境中的体验(go编译linux)
- Amazon Go 又添新伙伴,松下电器推出自动收银台(附视频)
- 关键字在SQL Server中利用GO关键字实现更优化的操作(sqlserver中go)
- 便捷使用Go编程连接Redis(go连接redis)
- 徒手用Go编写Redis迈向新技术世界的旅程(徒手用go写个redis)
- Go语言链接Oracle数据库的实践记录(go 链接oracle)
- 数据库Go语言实现监控Oracle数据库(go监听oracle)