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

钩子函数与回调机制专题

专题说明

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

学习目标

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

学习内容

本专题涵盖以下知识点:

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

学习建议

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

📝 发现内容有误?点击此处直接编辑

📝 配套习题(17 题)

1
单选题

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

A

在记录插入数据库之前

B

在记录插入数据库之后

C

在记录更新之前

D

在记录删除之前

2
多选题

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

A

为新用户生成默认头像 URL

B

对密码字段进行加密

C

发送注册成功邮件

D

校验用户名长度

3
填空题

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

4
单选题

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

A

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

B

设置创建时间

C

删除关联数据

D

初始化默认值

5
多选题

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

A

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

B

钩子中可以修改字段值

C

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

D

AfterUpdate 无法修改字段值

6
单选题

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

A

执行软删除时

B

执行硬删除时

C

软删除和硬删除都会

D

只有使用 Unscoped 时

7
多选题

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

A

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

B

记录删除操作到审计日志

C

释放用户占用的资源

D

在软删除时备份数据

8
单选题

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

A

在执行查询 SQL 之前

B

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

C

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

D

在查询完成后返回结果前

9
多选题

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

A

对加密字段进行解密

B

计算并填充派生字段

C

加载关联数据

D

校验查询结果

10
填空题

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

11
单选题

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

A

在 Save 方法执行前

B

在 Update/Updates 方法执行前

C

在数据库事务提交前

D

A 和 B 都正确

12
多选题

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

A

可以,使用 tx 参数

B

可以,但不能影响主事务

C

不可以,会死锁

D

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

13
单选题

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

A

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

B

阻止删除操作

C

记录删除日志

D

A 和 C 都可以

14
判断题

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

A

B

15
单选题

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

A

在查询后修改返回的数据

B

在查询前添加过滤条件

C

预加载关联数据

D

记录查询日志

16
多选题

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

A

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

B

对密码字段进行脱敏处理

C

在查询前添加 WHERE 条件

D

加载额外的关联数据

17
填空题

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

← 上一个专题 软删除机制专题
下一个专题 → 错误处理与日志专题

📝 发现内容有误?点击此处直接编辑

想查看更多习题和详细解析?
小程序提供完整的题库和详细解析

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库