如何确保在golang中创建对象后使用方法?

6
我有一个struct,在其中我写了一个new方法,它生成对象并返回指针。
现在我还有另一个方法,例如Close,但目前不强制要求调用此方法一旦对象被创建。我想确保如果对象被创建,则此方法必须被调用。在Golang中如何实现这个功能呢?如果可以的话,我不知道这叫什么名字,请帮忙。谢谢。
2个回答

11

无法强制调用Close()方法。您所能做的最好办法是明确记录,如果不再需要类型的值,则必须调用其Close()方法。

在程序被强制终止的极端情况下,您无法保证任何代码都会运行。

请注意,有一个runtime.SetFinalizer()函数,允许您注册一个函数,在垃圾收集器发现值/块不可达时将调用该函数。但请知道,不能保证您注册的函数将在程序退出之前运行。引用自其文档:

不能保证在程序退出之前会运行终结器,因此它们通常仅在长时间运行的程序中对释放与对象关联的非内存资源有用。

您可以选择使您的类型未导出,并提供一个导出的构造函数,例如NewMyType(),其中您可以适当地初始化结构体/类型。尽管无法强迫其他人在使用完您的值后调用其Close()方法,但至少可以停止担心错误的初始化。


谢谢。不仅仅是析构函数,如果有一个像object.run()这样的方法,它会设置一些变量,并且如果没有使用该方法,对象可能会抛出空指针错误,是否有办法强制用户使用.run()方法? - scott
太棒了@icza,非常感谢。 - scott
我可以问一下为什么原回答的这部分被删除了吗?:“...还要返回一个接口类型而不是具体类型,接口应该包含其他人想要使用您的值所需的所有内容。当然,您的具体类型必须实现该接口。” 它被删除是因为返回具体类型比返回接口更好吗?如果是这样,为什么呢? - starriet
@starriet 在 Go 中实现接口是隐式的(没有意图声明)。应该在需要时创建接口。如果方法集是接口的超集,则所有现有类型都将实现该接口。 - icza
1
@starriet 最好返回具体类型,并在需要时创建/使用接口。 - icza
显示剩余2条评论

2
简而言之,Go语言中不可能实现。
你要找的术语是“析构函数”,但Go语言并没有实现它。想了解更多信息,请阅读这里的优秀答案:Go destructors?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接