全部学科
Python全栈
python
NodeJS全栈
nodejs
📝 1 篇文章 17 道配套习题

钩子函数与回调机制专题

专题说明

本专题深入讲解 GORM 钩子函数(Model Hooks)和回调机制(Callbacks),包括 BeforeCreate/AfterSave 等生命周期钩子、回调链的构建与扩展、钩子触发时机与顺序控制,帮助实现数据校验、自动填充、审计日志等功能。

学习目标

  1. 掌握 GORM 模型钩子的定义方法和调用时机
  2. 理解回调链的内部结构和扩展方式
  3. 学会使用钩子实现数据校验、自动填充和审计
  4. 掌握钩子中的事务和错误处理技巧

学习内容

本专题涵盖以下知识点:

  • 模型钩子(BeforeCreate/AfterCreate/BeforeSave/AfterSave 等)
  • 钩子的返回值与错误处理
  • 回调链的注册、替换和移除
  • 钩子与事务的交互
  • 跳过钩子的方法(Session 配置)

学习建议

  1. 区分模型钩子和回调链的差异:钩子绑定在模型上,回调链绑定在 DB 实例上
  2. 钩子中返回错误会中断整个操作流程
  3. 批量操作时钩子的触发行为与单条操作不同,注意验证

📝 配套习题(17 题)

💡 参考答案在文末
判断题
1

db.Unscoped().Delete(&user) 也会触发 BeforeDelete 和 AfterDelete 钩子。

A

B

单选题
2

BeforeUpdate 钩子在什么时候被调用?

A

在 Save 方法执行前

B

在 Update/Updates 方法执行前

C

在数据库事务提交前

D

A 和 B 都正确

3

AfterFind 钩子的主要用途是什么?

A

在查询后修改返回的数据

B

在查询前添加过滤条件

C

预加载关联数据

D

记录查询日志

4

BeforeUpdate 钩子适合用于以下哪个场景?

A

记录更新前的数据到审计日志

B

设置创建时间

C

删除关联数据

D

初始化默认值

5

GORM 的 BeforeCreate 钩子在什么时候被调用?

A

在记录插入数据库之前

B

在记录插入数据库之后

C

在记录更新之前

D

在记录删除之前

6

BeforeDelete 钩子在什么情况下会被调用?

A

执行软删除时

B

执行硬删除时

C

软删除和硬删除都会

D

只有使用 Unscoped 时

7

BeforeDelete 钩子的主要用途是什么?

A

在删除前执行清理逻辑,如删除关联文件

B

阻止删除操作

C

记录删除日志

D

A 和 C 都可以

8

GORM 的 AfterFind 钩子在什么时候被调用?

A

在执行查询 SQL 之前

B

在数据从数据库加载后,映射到结构体之前

C

在数据从数据库加载后,映射到结构体之后

D

在查询完成后返回结果前

多选题
9

以下关于更新钩子的描述,哪些是正确的?

A

BeforeUpdate 在 Updates 和 Save 方法时都会调用

B

钩子中可以修改字段值

C

如果钩子返回错误,更新会被中止

D

AfterUpdate 无法修改字段值

10

以下哪些场景适合使用 AfterFind 钩子?

A

对加密字段进行解密

B

计算并填充派生字段

C

加载关联数据

D

校验查询结果

11

在 AfterUpdate 钩子中可以执行数据库操作吗?

A

可以,使用 tx 参数

B

可以,但不能影响主事务

C

不可以,会死锁

D

可以,但需要小心避免递归

12

以下哪些场景适合使用删除钩子?

A

删除用户时级联删除关联的订单数据

B

记录删除操作到审计日志

C

释放用户占用的资源

D

在软删除时备份数据

13

以下哪些场景适合使用 BeforeCreate 钩子?

A

为新用户生成默认头像 URL

B

对密码字段进行加密

C

发送注册成功邮件

D

校验用户名长度

14

以下哪些场景适合使用 AfterFind 钩子?

A

将数据库中的 JSON 字符串解析为 Go 结构体

B

对密码字段进行脱敏处理

C

在查询前添加 WHERE 条件

D

加载额外的关联数据

填空题
15

GORM 的钩子执行顺序为:____________钩子 -> 执行SQL -> ____________钩子。如果 Before 钩子返回错误,则不会执行 SQL 和 After 钩子。

16

定义 GORM 钩子的方法是实现____________方法,如果返回错误则会____________插入操作。

17

GORM 钩子方法的标准签名为 func (m *Model) ____________(tx *____________) error。

参考答案
1.正确 2.D 3.A 4.A 5.A 6.C 7.D 8.C 9.A;B;C 10.A;B 11.A;B;D 12.A;B;C;D 13.A;B;D 14.A;B;D 15.Before;After 16.BeforeCreate(tx *gorm.DB) error;中止 17.AfterFind;gorm.DB
想在手机上练习这套专题?
使用微信卷王开发者小程序,打开首页顶部扫码功能识别二维码
← 上一个专题 软删除机制专题
下一个专题 → 错误处理与日志专题
扫码体验小程序
加载中
想在手机上刷题学习?
使用微信卷王开发者小程序,打开首页顶部扫码功能识别二维码