GORM 高频面试题及详细实战答案(Go开发面试专用)_第1页
GORM 高频面试题及详细实战答案(Go开发面试专用)_第2页
GORM 高频面试题及详细实战答案(Go开发面试专用)_第3页
GORM 高频面试题及详细实战答案(Go开发面试专用)_第4页
GORM 高频面试题及详细实战答案(Go开发面试专用)_第5页
已阅读5页,还剩2页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

GORM高频面试题及详细实战答案(Go开发面试专用)一、基础认知类1.简单说说你对GORM的理解,它的核心作用是什么?答案:GORM是Go语言最主流的ORM数据库操作库,核心作用是屏蔽原生SQL的繁琐写法,通过结构体、方法调用的方式实现数据库的增删改查、事务、关联查询、迁移等操作。它规避了手动拼接SQL容易出现的语法错误、SQL注入问题,同时兼容MySQL、PostgreSQL、SQLite、SQLServer等主流数据库,一套代码可适配多数据库,大幅提升Go后端数据库开发效率。日常开发中,绝大多数简单、常规的数据库操作都可以通过GORM链式调用完成,无需写原生SQL。2.GORM中结构体模型和数据库表的映射规则是什么?答案:默认遵循驼峰转下划线、单数转复数的规则:结构体名:User->默认对应数据表:users结构体字段:UserName->默认对应数据库字段:user_name如果需要自定义表名,可以给结构体实现TableName()string方法。如果需要自定义字段名,通过结构体taggorm:"column:xxx"指定。另外GORM默认预留两个字段:CreatedAt、UpdatedAt,会自动填充创建、更新时间;DeletedAt用于实现软删除。3.解释GORM中零值问题,以及如何解决?答案:Go中基础类型都有默认零值,比如int默认0、string默认空字符串、bool默认false。GORM默认会将非指针类型的零值视为「有值」,更新/创建时会把零值写入数据库,导致业务异常,比如想忽略空字段更新,结果清空了数据库原有数据。解决方案:使用指针类型:字段定义为*int、*string,零值为nil,GORM会自动忽略nil字段使用omitempty标签:gorm:"column:name;omitempty",空值不参与写入和更新使用Select明确指定字段:更新时只更新指定字段,避免全量更新二、增删改查高频题4.GORMCreate、Save、Update的区别?答案:Create:纯创建操作,只用于新增数据,无法更新数据,传入结构体必须是新数据,主键存在也会新增报错Save:兼具新增和更新能力,会判断主键值。主键为零值则新增,主键有值则根据主键更新整条数据,会更新所有非零字段,风险较高Update/Updates:纯更新操作。Update更新单个字段,Updates批量更新多个字段;默认只会更新非零值字段,配合Select可指定更新字段日常业务开发中,优先用Create做新增,用Updates做更新,尽量少用Save,避免误更新全量字段。5.GORM如何实现只更新非零值、指定字段、忽略某字段更新?答案:默认更新:db.Model(&user).Updates(user)自动忽略零值字段,只更新有值字段指定字段更新:db.Model(&user).Select("name","age").Updates(user),只更新指定字段忽略指定字段:db.Model(&user).Omit("created_at").Updates(user),跳过指定字段不更新强制更新零值:db.Model(&user).Select("*").Updates(user),全字段强制更新,包含零值6.GORM软删除和硬删除的区别?如何实现?答案:硬删除:直接执行DELETE语句,数据从数据库彻底删除,无法恢复,使用db.Delete(&user)软删除:逻辑删除,不真实删除数据,仅更新DeletedAt字段为删除时间。GORM自带软删除能力,结构体只要包含DeletedAtgorm.DeletedAt字段,自动开启软删除开启软删除后,普通查询会自动过滤DeletedAt非空的已删除数据;如需查询已删除数据,需要加Unscoped()方法。示例:软删除:db.Delete(&user)查询包含已删除数据:db.Unscoped().Find(&users)彻底硬删除:db.Unscoped().Delete(&user)7.GORMFind、First、Take、Last的区别?答案:Find:查询多条数据,无数据不报错,返回空切片,日常批量查询首选First:查询第一条数据,默认按主键升序,无数据会返回gorm.ErrRecordNotFound错误Take:随机取一条数据,不排序,无数据报错,性能比First略高Last:查询最后一条数据,默认按主键降序,无数据报错业务开发中,查询单条数据优先用First,需要兜底判空处理;批量查询统一用Find。三、关联查询(高频面试重点)8.GORM一对一、一对多关联怎么实现?预加载是什么?答案:(1)一对一关联用户和用户详情,通过外键关联,结构体使用HasOne,主表包含子表结构体。查询时需要预加载,否则关联字段为空。(2)一对多关联用户和文章,一个用户多篇文章,结构体使用HasMany,主表包含子表切片。(3)预加载PreloadGORM默认不会自动查询关联表数据,只会查询主表,关联字段为空。Preload的作用是主动加载关联表数据,解决N+1查询问题。示例:查询用户并加载用户所有文章db.Preload("Articles").Find(&users)9.什么是GORMN+1查询问题?怎么解决?答案:N+1问题是指:先查询1次主表数据(1次SQL),遍历每条主表数据时,单独查询关联表,产生N条SQL,数据量大时会严重拖慢接口性能。解决方案:统一使用Preload预加载关联数据,GORM会自动优化为2次SQL:1次查主表,1次批量查关联表复杂关联使用Joins连表查询,直接单SQL查出所有数据四、事务与并发10.GORM事务怎么使用?自动事务和手动事务区别?答案:自动事务(推荐)使用Transaction方法,内部逻辑无错误自动提交,出现panic或error自动回滚,代码简洁、安全性高,业务开发首选。手动事务手动开启Begin(),手动执行Commit()、Rollback(),灵活性更高,适合复杂分支事务逻辑,但需要自己处理所有异常和回滚逻辑,容易遗漏出错。11.GORM事务中需要注意哪些坑?答案:事务内必须使用事务句柄执行所有数据库操作,不能用全局DB,否则会脱离事务,导致数据不一致事务内禁止嵌套事务,会引发异常事务中尽量减少非数据库操作,避免事务耗时过长,占用数据库连接必须做好异常捕获,确保报错时一定执行回滚,避免死事务五、性能优化与实战坑点(面试加分项)12.GORM批量创建数据怎么优化?批量插入坑点?答案:普通循环Create单条数据,每条都会执行一次SQL,性能极差。批量插入必须使用CreateInBatches方法。示例:db.CreateInBatches(&userList,100),每100条批量插入一次。坑点:批量插入默认不会返回每条数据的自增ID,需要主动配置单次批量数据量不宜过大,避免超出数据库SQL长度限制,常规分批50-200条最合适13.GORM如何开启SQL日志?生产环境如何优化日志?答案:开发环境通过配置Logger开启完整SQL日志,可打印执行的SQL、参数、耗时,方便排查问题。生产环境不建议打印完整SQL,一方面日志量大,另一方面存在参数泄露风险。可以配置慢SQL日志,只打印执行耗时超过阈值的SQL,兼顾排查和性能。14.GORM索引失效、查询慢的常见原因?答案:查询条件使用函数、类型转换,导致索引失效,比如时间字段用函数处理模糊查询左匹配不全,如%xxx前置通配符,无法走索引预加载过多关联数据、未分页查询全表数据更新时未加索引条件,导致全表更新、锁表15.GORMModel和Table方法的区别?答案:Model:传入结构体/结构体指针,会读取结构体的标签、字段、表名配置,自动映射字段、时间、软删除等规则,适合结构化CRUDTable:直接指定表名字符串,完全脱离结构体规则,不会自动处理时间、软删除、字段映射,适合复杂自定义SQL、视图查询日常常规操作优先用Model,自定义复杂SQL场景用Table。六、进阶面试题16.GORM原生SQL怎么执行?什么时候需要写原生SQL?答案:通过Raw()写原生查询SQL,Exec()执行增删改原生SQL。适用场景:复杂多表联查、分组统计、聚合查询,GORM链式调用写法繁琐数据库特殊函数、复杂语法,ORM不支持极致性能优化,需要手写最优SQL简单业务禁止滥用原生SQL,避免失去ORM的维护性和防注入优势。17.如何防止GORMSQL注入?答案:禁止手动拼接SQL字符串,这是注入的主要原因使用GORM链式方法(Where、Select等),底层自动参数预编译、转义写原生SQL时,使用占位符传参,而非字符串拼接:db.Raw("select*fromuserwhereid=?",id)GORM原生的参数化查询完全可以规避SQL注入风险,核心就是杜绝字符串拼接。18.GORM连接池如何配置?核心参数作用?答案:GORM基于database/sql标准

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论