• 请不要在回答技术问题时复制粘贴 AI 生成的内容
szzhiyang
V2EX  ›  程序员

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

  •  
  •   szzhiyang · Aug 1, 2020 · 4185 views
    This topic created in 2287 days ago, the information mentioned may be changed or developed.

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


    17 replies  •  2020-08-02 17:31:42 +08:00
    simple2025
    simple2025
    Aug 1, 2020
    1
    python 有 with,为什么要 defer?
    mind3x
    mind3x
    Aug 1, 2020
    2
    java 有 try with resource, 为什么 defer?
    pp22
    pp22
    Aug 1, 2020 via Android
    3
    很简单 ,自己写一个 go,想用什么语句都可以
    wspsxing
    wspsxing
    Aug 1, 2020 via Android
    4
    rust 有 drop,为什么要 defer
    abbycin
    abbycin
    Aug 1, 2020 via Android
    5
    @wspsxing cpp 有 raii,为什么要 defer
    ysc3839
    ysc3839
    Aug 1, 2020 via Android
    6
    C++ 通过析构函数可以实现 scope exit,看上去和 golang 的 defer 差不多。
    aloxaf
    aloxaf
    Aug 1, 2020
    7
    Rust 还真有这么个库……叫 scopedguard,用的人还意外地挺多的……

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

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

    C++ 用同样的方式应该也能做到
    lcode
    lcode
    Aug 1, 2020
    8
    感觉在给 go 招黑
    allAboutDbmss
    allAboutDbmss
    Aug 1, 2020
    9
    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
    yumeko
    Aug 2, 2020❤️1
    10
    如何在其他编程语言中用上 Go 的 if err != nil....
    sardina
    sardina
    Aug 2, 2020 via iPhone
    11
    python 把 with 重命名 defer
    lxk11153
    lxk11153
    Aug 2, 2020
    12
    如何在小霸王上完极品飞车 [doge]
    itskingname
    itskingname
    Aug 2, 2020
    13
    不要听楼上的人乱说,在 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
    chenxytw
    Aug 2, 2020
    14
    @itskingname ?这本质上不就是 with 么,只是帮你写了个统一的 contextmanager 而已.....
    itskingname
    itskingname
    Aug 2, 2020
    15
    @chenxytw 不一样,这里有一个调用栈的问题。先进栈的函数后执行,后进栈的函数先执行。单纯用 with 是无法实现的。
    locoz
    locoz
    Aug 2, 2020
    16
    @itskingname #13 骚
    nyz1500
    nyz1500
    Aug 2, 2020
    17
    Swift 有 defer,为什么要 defer (x
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1574 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 48ms · UTC 23:41 · PVG 07:41 · LAX 15:41 · JFK 18:41
    ♥ Do have faith in what you're doing.