【发布时间】:2016-08-17 23:56:31
【问题描述】:
我有一个struct,我有一个我编写的new 方法,它生成对象并返回它的指针。
现在我还有另一个方法,例如Close,但到目前为止,一旦创建对象,就不必调用此方法。我想确保在创建对象时必须调用此方法。我如何在 Golang 中做到这一点?如果这是可能的,我也不知道这叫什么。请帮忙。谢谢。
【问题讨论】:
我有一个struct,我有一个我编写的new 方法,它生成对象并返回它的指针。
现在我还有另一个方法,例如Close,但到目前为止,一旦创建对象,就不必调用此方法。我想确保在创建对象时必须调用此方法。我如何在 Golang 中做到这一点?如果这是可能的,我也不知道这叫什么。请帮忙。谢谢。
【问题讨论】:
没有办法强制调用Close() 方法。您能做的最好的事情就是清楚地记录下,如果不再需要您的类型的值,则必须调用其 Close() 方法。
在程序被强制终止的极端情况下,你无法保证任何代码都会运行。
请注意,有一个runtime.SetFinalizer() 函数允许您注册一个函数,当垃圾收集器发现一个值/块无法访问时将调用该函数。但是要知道,不能保证您注册的函数会在程序退出之前运行。引用其文档:
无法保证终结器会在程序退出之前运行,因此它们通常仅用于在长时间运行的程序期间释放与对象关联的非内存资源。
您可以选择不导出您的类型,并提供一个导出的构造函数,如NewMyType(),您可以在其中正确初始化您的结构/类型。你不能强迫别人在用完你的值后调用它的Close()方法,但至少你可以不用担心初始化不当。
【讨论】:
object.run()这样的方法,它设置了一些变量,没有它,对象可能会抛出一些零指针错误,有没有办法强制用户使用.run()方法?
简而言之,在go中是不可能的。
您要查找的术语是 Go 未实现的析构函数。有关更多信息,请在此处阅读出色的答案:Go destructors?
【讨论】: