我有一个struct
,我有一个new
方法,我写了,它生成对象并返回它的指针。如何确保在golang中创建对象后使用方法?
现在我还有另一种方法,例如,Close
,但是到目前为止,创建对象后不一定要调用此方法。我想确保在创建对象时必须调用此方法。我如何在Golang中做到这一点?如果这是可能的,我不知道这是什么。请帮忙。谢谢。
我有一个struct
,我有一个new
方法,我写了,它生成对象并返回它的指针。如何确保在golang中创建对象后使用方法?
现在我还有另一种方法,例如,Close
,但是到目前为止,创建对象后不一定要调用此方法。我想确保在创建对象时必须调用此方法。我如何在Golang中做到这一点?如果这是可能的,我不知道这是什么。请帮忙。谢谢。
没有办法强制呼叫Close()
方法。你所能做的最好的事情就是清楚地记录下来,如果你的类型的价值不再需要,它的方法必须被调用。
在程序强行终止的极端情况下,您不能保证任何代码都能运行。
请注意,有一个runtime.SetFinalizer()
函数,它允许您注册一个函数,该函数在垃圾回收器找到值/块不可访问时将被调用。但是要知道,在程序退出之前不能保证你的注册函数会被运行。从其文档引用:
无法保证终结器在程序退出前运行,因此通常它们仅用于在长时间运行的程序期间释放与对象关联的非内存资源。
一个好的设计是让你的类型导出,而是提供了一个出口构造函数一样NewMyType()
在其中您可以正确初始化你的结构/类型。同时返回一个接口类型而不是一个具体的类型,接口应该包含其他人想要处理的值。当然你的具体类型必须实现那个接口。当他们完成你的价值时,你不能强迫其他人调用它的方法,但至少你可以停止担心不正确的初始化。
总之,这是不可能的。
您正在寻找的术语是Go不执行的析构函数。欲了解更多信息,请在此阅读优秀的答案:Go destructors?
谢谢。不仅仅是析构函数,但是如果有一个像'object.run()'这样的方法来设置一些变量,没有这个方法,对象可以抛出一些nilpointer错误,是否有任何方法可以让用户使用'.run() '方法? – scott
@scott查看编辑答案。 – icza
完美@icza,非常感谢。 – scott