1
我正在編寫一個包,用於創建與Kafka的連接。當完成與包的合作時強制調用Close()
我在包中的主文件中的init()
函數中創建連接。在使用程序包的程序停止後,我想調用一個名爲Close()
的函數是否有辦法在程序包級別強制執行它,而不是將此責任交給用戶?
假設連接應該在整個用戶程序的運行過程中都可用,我不想每次都初始化它。
我正在編寫一個包,用於創建與Kafka的連接。當完成與包的合作時強制調用Close()
我在包中的主文件中的init()
函數中創建連接。在使用程序包的程序停止後,我想調用一個名爲Close()
的函數是否有辦法在程序包級別強制執行它,而不是將此責任交給用戶?
假設連接應該在整個用戶程序的運行過程中都可用,我不想每次都初始化它。
對於幾乎任何資源(連接沒有不同),用戶應該調用函數以在使用後將資源返回給系統。大多數用戶在不同的語言和體系結構中理解這一點,所以我不明白爲什麼你的軟件包用戶應該有任何問題。 Go通過包含defer語句非常優雅地解決了這個問題,這使得提供釋放資源變得非常容易。
你不能執行這樣的事情。你可以利用['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
你應該避免使用'SetFinalizer()',特別是在Go 1.8中,因爲它可以在某些情況下最終被調用早。 – Flimzy
正確記錄您的包裹。清理等事情是用戶的責任。用於處理幕後事務的軟件包越多,從長遠來看越可能爲用戶造成問題。 –