当前位置: 首页 > news >正文

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 的垃圾回收器只会自动释放内存,但不会自动关闭文件、数据库连接等 “非内存资源”。这些资源你必须手动关闭。

相关文章:

  • Java详解LeetCode 热题 100(20):LeetCode 48. 旋转图像(Rotate Image)详解
  • Linux入门(九)任务调度
  • 【Go】1、Go语言基础
  • 【Java高阶面经:消息队列篇】23、Kafka延迟消息:实现高并发场景下的延迟任务处理
  • 今日行情明日机会——20250523
  • Selenium 测试框架 - Java
  • el-input宽度自适应方法总结
  • 深入解析Spring Boot与Redis集成:高性能缓存实践
  • [crxjs]自己创建一个浏览器插件
  • Android中Binder驱动作用?
  • 【AS32X601驱动系列教程】GPIO_点亮LED详解
  • 服务器修改/home的挂载路径
  • HTB-Season8-Puppy-WriteUp
  • Teensy LC 一款由 PJRC 公司开发的高性能 32 位微控制器开发板
  • 图解深度学习 - 机器学习简史
  • 【Mini-F5265-OB开发板试用测评】2、关于platform.c中的串口号初始化修改的建议
  • vue中v-clock指令
  • 分布式消息队列kafka详解
  • Vue3.5 企业级管理系统实战(二十):角色菜单
  • 把英语电子书翻译为中文 epub
  • 怎么让百度收录你的网站/河南网站推广优化排名
  • 如何做优秀的视频网站设计/网站制作详细流程
  • 手机网站建设多少钱/北京seo主管
  • 北海市住建局官方网站/全网推广软件
  • 网站建设公司哪家比较好/大数据精准客户
  • 企业宣传网站怎么做/注册城乡规划师好考吗