如何在其他编程语言中用上 Go 的 defer 语句?

2020-08-01 19:17:37 +08:00
 szzhiyang

Go 的 defer 语句的使用场景比 C++ 的析构函数和 Python 的 with 语句更加丰富,有什么办法能在其他编程语言中用上 Go 的 defer 语句吗?


3264 次点击
所在节点    程序员
17 条回复
chenqh
2020-08-01 19:19:17 +08:00
python 有 with,为什么要 defer?
mind3x
2020-08-01 19:45:32 +08:00
java 有 try with resource, 为什么 defer?
pp22
2020-08-01 19:49:21 +08:00
很简单 ,自己写一个 go,想用什么语句都可以
wspsxing
2020-08-01 20:18:53 +08:00
rust 有 drop,为什么要 defer
abbycin
2020-08-01 20:23:52 +08:00
@wspsxing cpp 有 raii,为什么要 defer
ysc3839
2020-08-01 20:58:07 +08:00
C++ 通过析构函数可以实现 scope exit,看上去和 golang 的 defer 差不多。
aloxaf
2020-08-01 21:49:40 +08:00
Rust 还真有这么个库……叫 scopedguard,用的人还意外地挺多的……

原理是定义一个类型,初始化时接受一个闭包,然后析构时调用这个闭包
再定义一个 defer! 宏简化一下初始化流程即可

看了一下实现还挺灵活的,甚至可以选择执行的时机——总是执行、仅 panic 时执行、仅未 panic 时执行

C++ 用同样的方式应该也能做到
lcode
2020-08-01 22:25:40 +08:00
感觉在给 go 招黑
allAboutDbmss
2020-08-01 22:34:55 +08:00
C++

```c++
struct Defer {
/// The deferred function.
std::function<void()> fn;

/// Constructor.
explicit Defer(std::function<void()> fn)
: fn(std::move(fn)) {}

/// Destructor.
/// Calls the deferred function.
~Defer() { fn(); }

/// Runs the deferred funciton.
void run() { fn(); fn = [](){}; }
};
```
yumeko
2020-08-02 05:03:28 +08:00
如何在其他编程语言中用上 Go 的 if err != nil....
sardina
2020-08-02 06:39:47 +08:00
python 把 with 重命名 defer
lxk11153
2020-08-02 07:00:32 +08:00
如何在小霸王上完极品飞车 [doge]
itskingname
2020-08-02 09:58:22 +08:00
不要听楼上的人乱说,在 Python 里面,最接近 defer 的是 contextlib.ExitStack
它的使用方法看我这篇文章:[一日一技:在 Python 中实现延迟调用
]( https://mp.weixin.qq.com/s?__biz=MzI2MzEwNTY3OQ==&mid=2648978231&idx=1&sn=dd091611fcf1aa0c2aef9655f13e7731&chksm=f2506ed7c527e7c1f2430d5303a3e93d60d0bae88949b03457dbc3bb794f538bc54a91efd6de&token=1008659887&lang=zh_CN#rd)
chenxytw
2020-08-02 10:24:28 +08:00
@itskingname ?这本质上不就是 with 么,只是帮你写了个统一的 contextmanager 而已.....
itskingname
2020-08-02 10:28:55 +08:00
@chenxytw 不一样,这里有一个调用栈的问题。先进栈的函数后执行,后进栈的函数先执行。单纯用 with 是无法实现的。
locoz
2020-08-02 17:08:49 +08:00
@itskingname #13 骚
nyz1500
2020-08-02 17:31:42 +08:00
Swift 有 defer,为什么要 defer (x

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/694876

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX