![](/img/trans.png)
[英]Is there a way to release unmanaged resources when a Go struct is collected?
[英]When to release resources in a long running Go program?
我正在使用Go 和 Socket.io構建聊天服務器,因此服務器將無限期運行。 我需要在程序啟動時分配多種資源,例如數據庫連接、redis 連接等。
現在我想知道什么時候應該釋放(關閉)所有這些連接? 我可以在main
函數中使用defer
嗎? 當main
到達終點時,這會關閉它們嗎? 或者我應該讓它們保持打開狀態,因為程序不會自行退出?
我傾向於做的一件事是:
func main() {
if err := run(); err != nil {
log.Fatal(err)
}
}
func run() error {
// Do stuff here
}
在run
您可以defer
習慣defer
。 但是,在像服務器這樣的長時間運行的程序中,IMO 可以直接退出:操作系統將自動清理進程占用的所有資源,並且您連接到的任何數據庫或后端都必須能夠處理無論如何,進程意外死亡。 這稱為“僅崩潰的軟件”。
對於測試,您應該以不依賴於全局狀態的方式構建代碼 - 例如,有一個包含數據庫連接字段的結構體等。使業務邏輯成為該結構體上的方法(或采用它的函數) . 然后,您可以在main
填充這樣的結構並調用其方法。 對於測試,您可以填充一個結構,為您想要執行的任何測試調用其方法,然后在測試結束時拆除連接。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.