0

0

Golang空对象模式在DAO层查询不到数据时的返回处理

P粉602998670

P粉602998670

发布时间:2026-03-08 11:34:50

|

403人浏览过

|

来源于php中文网

原创

应返回零值结构体+nil错误而非nil+sql.errnorows,以区分“查无结果”与“数据库异常”;避免包装sql.errnorows,字段优先用值类型确保零值安全,混用orm时需统一空对象适配。

golang空对象模式在dao层查询不到数据时的返回处理

Go 的 sql.QueryRow 返回 sql.ErrNoRows 时别直接返回 nil

DAO 层查不到数据,最常见的是 sql.QueryRow 执行后返回 sql.ErrNoRows。这时候如果直接返回 nil(比如 return nil, err),调用方就失去了区分「查无结果」和「数据库异常」的能力——两者都表现为 err != nil,但语义完全不同。

实操建议:

立即学习go语言免费学习笔记(深入)”;

Veed AI Voice Generator
Veed AI Voice Generator

Veed推出的AI语音生成器

下载
  • 显式判断 err == sql.ErrNoRows,然后返回一个有意义的空对象(如零值结构体)+ nil 错误,例如:return User{}, nil
  • 若业务上「查不到」属于正常流程(如查用户详情、查配置项),就不该让错误穿透到上层;只有网络中断、连接超时、语法错误等才该透出真实 error
  • 避免在 DAO 层做 if err != nil { return nil, err } 这种无差别转发,它把控制权交给了调用方,而调用方通常并不知道这个 error 是不是真的该 panic 或重试

定义「空对象」时注意结构体字段的零值是否安全

Go 没有「空对象模式」的语法糖,所谓空对象就是你手动构造的一个合法、可序列化、不引发 panic 的零值实例。但它是否真「安全」,取决于字段类型和后续使用方式。

实操建议:

立即学习go语言免费学习笔记(深入)”;

  • 字段尽量用值类型(intstringtime.Time),避免指针字段(如 *string)在零值时是 nil,导致下游 if u.Name != nil 判断意外失效
  • 如果必须保留指针字段(比如为了区分「未设置」和「设为空字符串」),那空对象里就别用 &"" 这种假指针,而是统一设为 nil,并在文档里写清语义
  • 对嵌套结构体(如 User.Profile),空对象里也要递归初始化为零值,否则 u.Profile.AvatarURL 会 panic

别在 DAO 层用 errors.Is(err, sql.ErrNoRows) 包装新错误

有些同学想“更明确地表达语义”,把 sql.ErrNoRows 转成自定义错误,比如 errors.New("user not found")。这反而破坏了错误分类能力——上层无法再用 errors.Is(err, sql.ErrNoRows) 做统一处理,也丢失了原始错误链中的上下文(比如哪条 SQL、哪个参数)。

实操建议:

立即学习go语言免费学习笔记(深入)”;

  • 除非你确定整个服务都弃用 sql.ErrNoRows 并统一用自定义错误体系,否则不要包装它
  • 如果真要加语义,用 fmt.Errorf("get user by id %d: %w", id, err),保留 %w,这样 errors.Is 依然能命中原错误
  • 警惕日志中反复打印同一行 sql.ErrNoRows:它不是异常,只是查询结果为空,日志级别建议设为 debug 或关掉

ORM(如 GORM)默认行为可能掩盖空对象意图

GORM 的 FirstTake 等方法在查不到时默认返回 gorm.ErrRecordNotFound,它和 sql.ErrNoRows 不同源。如果你混用原生 database/sql 和 GORM,又试图用同一套空对象逻辑兜底,就会漏判。

实操建议:

立即学习go语言免费学习笔记(深入)”;

  • 项目里只选一种数据访问方式,避免 DAO 层同时出现 db.QueryRowgorm.DB.First
  • 如果必须共存,封装一层适配器,在 GORM 调用后显式检查 errors.Is(err, gorm.ErrRecordNotFound),并转为一致的空对象返回约定
  • GORM v2 的 Find 方法返回切片,查不到是空切片([]User{}),这不是错误——注意别把它和 First 的错误返回混淆
事情说清了就结束。空对象不是写个零值 struct 就完事,关键在「谁来判断空」「空意味着什么」「下游怎么信得过这个空」——这三个问题没对齐,DAO 层的返回永远在给上层埋雷。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
golang如何定义变量
golang如何定义变量

golang定义变量的方法:1、声明变量并赋予初始值“var age int =值”;2、声明变量但不赋初始值“var age int”;3、使用短变量声明“age :=值”等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

210

2024.02.23

golang有哪些数据转换方法
golang有哪些数据转换方法

golang数据转换方法:1、类型转换操作符;2、类型断言;3、字符串和数字之间的转换;4、JSON序列化和反序列化;5、使用标准库进行数据转换;6、使用第三方库进行数据转换;7、自定义数据转换函数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

246

2024.02.23

golang常用库有哪些
golang常用库有哪些

golang常用库有:1、标准库;2、字符串处理库;3、网络库;4、加密库;5、压缩库;6、xml和json解析库;7、日期和时间库;8、数据库操作库;9、文件操作库;10、图像处理库。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

355

2024.02.23

golang和python的区别是什么
golang和python的区别是什么

golang和python的区别是:1、golang是一种编译型语言,而python是一种解释型语言;2、golang天生支持并发编程,而python对并发与并行的支持相对较弱等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

214

2024.03.05

golang是免费的吗
golang是免费的吗

golang是免费的。golang是google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的开源编程语言,采用bsd开源协议。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

407

2024.05.21

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

470

2025.06.09

golang相关判断方法
golang相关判断方法

本专题整合了golang相关判断方法,想了解更详细的相关内容,请阅读下面的文章。

200

2025.06.10

golang数组使用方法
golang数组使用方法

本专题整合了golang数组用法,想了解更多的相关内容,请阅读专题下面的文章。

1377

2025.06.17

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

23

2026.03.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 5.9万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号