2017-03-01 18 views
1

我正在編寫一個包,用於創建與Kafka的連接。當完成與包的合作時強制調用Close()

我在包中的主文件中的init()函數中創建連接。在使用程序包的程序停止後,我想調用一個名爲Close()

的函數是否有辦法在程序包級別強制執行它,而不是將此責任交給用戶?

假設連接應該在整個用戶程序的運行過程中都可用,我不想每次都初始化它。

+1

你不能執行這樣的事情。你可以利用['runtime.SetFinalizer()'](https://golang.org/pkg/runtime/#SetFinalizer),但它不能保證。請參閱相關問題:[如何確保在golang中創建對象後使用方法?](http://stackoverflow.com/questions/36826232/how-to-make-sure-that-a-method- is-used-one-object-is-created-in-golang/36826362#36826362) – icza

+0

你應該避免使用'SetFinalizer()',特別是在Go 1.8中,因爲它可以在某些情況下最終被調用早。 – Flimzy

+6

正確記錄您的包裹。清理等事情是用戶的責任。用於處理幕後事務的軟件包越多,從長遠來看越可能爲用戶造成問題。 –

回答

0

對於幾乎任何資源(連接沒有不同),用戶應該調用函數以在使用後將資源返回給系統。大多數用戶在不同的語言和體系結構中理解這一點,所以我不明白爲什麼你的軟件包用戶應該有任何問題。 Go通過包含defer語句非常優雅地解決了這個問題,這使得提供釋放資源變得非常容易。

相關問題