【问题标题】:Enforce calling Close() when finished working with the package使用完包后强制调用 Close()
【发布时间】:2017-07-20 11:57:33
【问题描述】:

我正在用 go 编写一个包来创建与 Kafka 的连接。

我在包的主文件中的init() 函数中创建连接。使用该包的程序停止后,我想调用一个名为Close()的函数

有没有办法在包级别强制执行,而不是将这个责任交给用户?

假设连接应该在用户程序的整个运行过程中都可用,我不想每次都初始化它。

【问题讨论】:

  • 你不能强制执行这样的事情。您可以利用runtime.SetFinalizer(),但它不能为您提供保证。查看相关问题:How to make sure that a method is used after an object is created in golang?
  • 您还应该避免使用SetFinalizer(),尤其是在 Go 1.8 中,因为在某些情况下,它可能会被提前调用。
  • 正确记录您的包裹。清理之类的事情是用户的责任。包尝试处理幕后的事情越多,从长远来看,它就越有可能给用户带来问题。

标签: go


【解决方案1】:

对于几乎任何资源(连接也不例外),用户应该调用函数以在使用后将资源返回给系统。大多数用户跨语言和架构理解这一点,所以我不明白为什么你的包用户应该有任何顾虑。 Go 通过包含 defer 语句非常优雅地解决了这个问题,这使得提供释放资源变得非常容易。

【讨论】:

    猜你喜欢
    • 2016-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-08
    相关资源
    最近更新 更多