Go語言中內存釋放 ≠ 資源釋放

// QueryUserFileMetas : 批量獲取用戶文件信息
func QueryUserFileMetas(username string, limit int) ([]UserFile, error) {stmt, err := mydb.DBConn().Prepare("select file_sha1,file_name,file_size,upload_at," +"last_update from tbl_user_file where user_name=? limit ?")if err != nil {return nil, err}defer stmt.Close()rows, err := stmt.Query(username, limit)if err != nil {return nil, err}var userFiles []UserFilefor rows.Next() {ufile := UserFile{}err = rows.Scan(&ufile.FileHash, &ufile.FileName, &ufile.FileSize,&ufile.UploadAt, &ufile.LastUpdated)if err != nil {fmt.Println(err.Error())break}userFiles = append(userFiles, ufile)}return userFiles, nil
}

這里的stmt需要手動回收,rows需要嗎?

對象是否需要手動關閉為什么
stmt(預處理語句)? 需要占用數據庫連接資源,必須關閉釋放資源
rows(查詢結果集)? 也需要持有數據庫游標或連接,必須關閉釋放資源

🔍 原因詳解
🔹1. stmt.Close()
stmt 是通過 Prepare() 創建的預編譯語句句柄。
它通常會綁定數據庫連接資源,即使查詢結束也不會自動釋放。
不關閉會導致連接池資源泄漏,最終使數據庫拒絕新的連接。

🔹2. rows.Close()
rows 是執行查詢后返回的結果集,底層其實是一個游標。
也持有數據庫連接,直到你顯式地關閉或完全遍歷完所有行。
如果不 Close():
連接不會釋放給連接池(可能一直掛起)
資源泄漏:數據庫連接數會越來越多,直到超出限制

? 總結
stmt.Close() 和 rows.Close() 都必須顯式調用,通常用 defer 來管理。
否則會引起連接池資源耗盡、數據庫連接泄漏等問題。
Go 的數據庫接口(database/sql)設計得很靈活,但需要你手動管理生命周期。

疑問?為什么不會隨著函數的調用結束被內存自動回收了呢?

🧠 背后原理:內存釋放 ≠ 資源釋放

Go 的垃圾回收器(GC)能做什么?
GC 只能自動清理內存對象(如你創建的結構體、切片、字符串等),前提是這些對象不再被引用。
GC 無法自動釋放 “非內存資源”,比如:

  1. 網絡連接(TCP socket).
  2. 數據庫連接
  3. 文件句柄
  4. goroutine(除非主動退出)
  5. 系統級游標、IO句柄等

? Go GC 是“內存管理器”,而非“資源管理器”。

🔍 對比:內存 vs 非內存資源

類型例子GC 能自動釋放?需要手動釋放?
內存對象[]byte, string, map? 是? 否
數據庫連接rows, stmt, tx? 否? 是
網絡連接net.Conn? 否? 是
文件句柄os.File? 否? 是

Go 的垃圾回收器只會自動釋放內存,但不會自動關閉文件、數據庫連接等 “非內存資源”。這些資源你必須手動關閉。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/81385.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/81385.shtml
英文地址,請注明出處:http://en.pswp.cn/web/81385.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

win11+vs2022 安裝opencv 4.11.0圖解教程

1. 下載opencv opencv官網下載地址:Releases - OpenCV 2. 雙擊運行該exe,即可進行安裝,安裝文件夾可自行選擇 安裝后目錄如下: 3. 配置環境變量 使用win鍵搜索環境變量,選中系統變量中的Path,然后點擊編輯…

【Linux】進程 信號的產生

🌻個人主頁:路飛雪吖~ 🌠專欄:Linux 目錄 一、掌握Linux信號的基本概念 🌠前臺進程 VS 后臺進程 🌠 小貼士: 🪄?個系統函數 --- signal() 🪄查看信號 --- man 7 sign…

Python 網絡編程入門

目錄 一、前言 二、網絡通信基礎12:TCP 與 UDP 協議解析 2.1 TCP 協議:可靠的面向連接通信 2.2 UDP 協7議:無連接的快速通信 2.3 Sock12et:網絡通信的基石 三、TCP 編程實15戰:從單工通信到雙向聊天 3.1 TCP 客…

Django壓縮包形式下載文件

通過web將minio上的文件以壓縮包-文件夾-文件的形式下載到本地 import os from bx_mes import settings from io import BytesIO import zipfile from django.http import StreamingHttpResponse class FileRemote(GenericAPIView):def post(self,request):# 壓縮包名folder_n…

Enhancing Relation Extractionvia Supervised Rationale Verifcation and Feedback

Enhancing Relation Extraction via Supervised Rationale Verification and Feedback| Proceedings of the AAAI Conference on Artificial Intelligencehttps://ojs.aaai.org/index.php/AAAI/article/view/34631 1. 概述 關系抽取(RE)任務旨在抽取文本中實體之間的語義關

【RAG】ragflow源碼亮點:文檔embedding向量化加權融合

引言: 最近在看ragflow源碼,其中有一個較為巧妙地設計:分別將 文字 、 標題 行向量化 之后,直接根據權重,進行加法運算,得到向量融合,增強了文本向量化的表示能力,這里開始討論一下…

限流系列:sentinel

目錄 滑動窗口算法 Sentinel 數據模型 示例 大致流程 ???????entry ???????entryWithPriority ???????FlowSlot.entry ???????checkFlow ???????canPass ???????avgUsedTokens ???????passQps ???????pa…

Java 訪問者模式深度重構:從靜態類型到動態行為的響應式設計實踐

一、訪問者模式的本質與核心價值 在軟件開發的漫長演進中,設計模式始終是架構師手中的利刃。當我們面對復雜對象結構上的多種操作需求時,訪問者模式(Visitor Pattern)猶如一把精密的手術刀,能夠優雅地分離數據結構與作…

UE 5 C++設置物體位置和旋轉,初始化虛幻引擎樣條線、加載引用虛幻編輯器中的藍圖、設置虛幻編輯器中Actor大小

一、設置物體位置和旋轉 UE.cpp文件中代碼: Mesh->SetWorldLocationAndRotation(FVector(50.0f, 50.0f, 50.0f),FRotator(0,-90,0)); vs代碼編輯器中旋轉信息順序(yzx): Pitch、 Yaw、 Roll UE編輯器中旋轉信息順序&#xf…

【文本分類】KG-HTC 知識圖譜提升分類準確率

最近看到一篇論文“KG-HTC: Integrating Knowledge Graphs into LLMs for Effective Zero-shot Hierarchical Text Classification”,介紹了文本分類的技巧,這篇文航主要利用了知識圖譜大模型的思路,實驗效果不錯,里面的一些論述也…

三大微調技術對比:Prompt/Prefix/P-Tuning

Prompt Tuning、Prefix Tuning和P - Tuning的區別 概念方面: Prompt Tuning:在輸入序列前添加可訓練的額外Token以適配下游任務,預訓練語言模型參數不變。比如在文本分類中,在句子前加特定Token如“(OPINION)”,讓模型理解是對觀點進行分類的任務。Prefix Tuning:在每層T…

14.「實用」扣子(coze)教程 | Excel文檔自動批量AI文檔生成實戰,中級開篇

隨著AI編程工具及其能力的不斷發展,編程將變得越來越簡單。 在這個大趨勢下,大師兄判斷未來的編程將真正成為像office工具一樣的辦公必備技能。每個人通過 (專業知識/資源編程)將自己變成一個復合型的人才,大大提高生…

量子-經典協同計算新路徑:NISQ 時代混合算法對后量子密碼學的適應性探索

內容來源:量子前哨(ID:Qforepost) 文丨浪味仙 排版丨浪味仙 行業動向:3700字丨10分鐘閱讀 5 月 20 日,由北京量子院、清華大學、數學工程與先進計算國家重點實驗室、南洋理工大學、量子信息前沿科學中心…

CentOS中安裝Docker Compose

在CentOS中安裝Docker Compose的步驟如下: 步驟 1:確保Docker已安裝 Docker Compose依賴Docker環境,請先安裝Docker: # 添加Docker官方倉庫 sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://downlo…

電商小程序店鋪詳情頁:頭部無限分類與篩選功能實現

電商小程序店鋪詳情頁:頭部無限分類與篩選功能實現 一、場景需求與技術選型二、頭部無限分類導航三、篩選功能實現:Picker多列選擇組件一、場景需求與技術選型 在電商小程序生態中,店鋪詳情頁作為用戶瀏覽商品的核心流量入口,其交互效率與功能完整性直接影響商品轉化率。傳…

Graph Neural Network(GNN)

我們首先要了解什么是圖,圖是由節點和邊組成的,邊的不一樣也導致節點的不同(參考化學有機分子中的碳原子) gnn可以處理classification的問題,也就是分類的問題 也可以處理generation的問題 借一部日劇來說明,這個日劇是講主角尋找殺害他父親的兇手的,劇中的人物有姓名和特征 …

FallbackHome的啟動流程(android11)

首次開機開機動畫播完進入Launcher桌面時黑屏進入Launcher,有黑屏不太美觀,在重啟以后會在進入桌面后會顯示android正在啟動等一會進入Launcher,這就是系統FallBackHome機制 接下來我們跟著代碼看下首次啟動系統如何進入FallbackHome的 在SystemServer的startOthe…

【EdgeYOLO】《EdgeYOLO: An Edge-Real-Time Object Detector》

Liu S, Zha J, Sun J, et al. EdgeYOLO: An edge-real-time object detector[C]//2023 42nd Chinese Control Conference (CCC). IEEE, 2023: 7507-7512. CCC-2023 源碼:https://github.com/LSH9832/edgeyolo 論文:https://arxiv.org/pdf/2302.07483 …

宮格導航--純血鴻蒙組件庫AUI

摘要: 宮格導航(A_GirdNav):可設置導航數據,建議導航項超過16個,可設置“更多”圖標指向的頁面路由。最多顯示兩行,手機每行最多顯示4個圖標,折疊屏每行最多6個圖標,平板每行最多8個圖標。多余圖…

調試的按鈕

在Debug的時候,會有一些按鈕,我們需要知道它們各自的作用。 注:調試器本身并沒有一個直接的、可以撤銷已執行代碼效果的“返回上一步(Undo Last Step)”或“逆向執行(Reverse Debugging)”按鈕…