渡边贝塔猫一面

面试问题#

  1. 请简单自我介绍一下
  2. 你学的是人工智能专业,为什么会想做后端开发?
  3. 讲讲你对 Go 语言的了解,它有哪些优点?
  4. Go 语言有哪些比较特殊的语言特性?
  5. Channel 三连问:无缓冲发数据 / 有缓冲无接收 / 有缓冲无人发
  6. 除了 Channel,哪些需要 make?Slice/Map 特点和注意事项
  7. Panic 三连问:panic 会怎样 / HTTP 服务中 panic 怎么处理 / 什么情况容易 panic
  8. MySQL vs Redis 数据分类
  9. 单实例除了 Redis 还有什么缓存方案?
  10. 缓存重建并发竞争怎么解决?
  11. Redis 数据结构及应用场景
  12. MySQL 索引:聚簇/非聚簇、回表、命中判断、覆盖索引
  13. 介绍一下 Feed 流项目
  14. 有本地缓存为什么还要 Redis?
  15. 分布式多实例本地缓存的问题
  16. RabbitMQ 解决什么问题?
  17. 用 goroutine / 任务表 / Redis 实现异步
  18. 消费者失败处理 & 快照机制
  19. RabbitMQ 消息确认机制
  20. 反问:对实习生的要求?
  21. 反问:内部用 AI 提效吗?
  22. 怎么看加班?
  23. 长期做后端还是可能会变?

参考答案(AI 生成)#

以下答案由 AI 生成,仅供面试复盘参考。

1. 请简单自我介绍一下#

我是人工智能专业,主要做过 Go 后端、Feed 流、本地缓存、Redis、RabbitMQ 相关项目。我的优势是学习快,能把算法和数据结构思维用到工程里,也愿意追线上问题、性能问题和业务细节。

2. 你学的是人工智能专业,为什么会想做后端开发?#

AI 专业让我接触了数据、模型和工程实现,我发现自己更喜欢把系统真正跑起来。后端开发更接近业务核心,也更锻炼并发、存储、缓存、消息队列这些工程能力。

3. 讲讲你对 Go 语言的了解,它有哪些优点?#

Go 是一门偏工程化的语言,语法简单、编译快、部署方便。它的 goroutine 和 channel 让并发开发成本很低,标准库也很完整,适合写 Web 服务、微服务、中间件和高并发系统。

4. Go 语言有哪些比较特殊的语言特性?#

Go 比较特殊的点有 goroutine、channel、defer、interface、组合式结构体、显式错误返回。它通过 CSP 模型处理并发,也通过垃圾回收降低内存管理成本。

5. Channel 三连问:无缓冲发数据 / 有缓冲无接收 / 有缓冲无人发#

无缓冲 channel 发数据时,发送方会阻塞,直到接收方接收。

有缓冲 channel 发数据且无人接收时,缓冲区未满可以写入,缓冲区满后发送方阻塞。

有缓冲 channel 接收且无人发送时,缓冲区有数据就读,读空后阻塞;channel 关闭后继续读会得到零值和 ok=false。

6. 除了 Channel,哪些需要 make?Slice/Map 特点和注意事项#

make 用于 slice、map、channel。

slice 是动态数组视图,包含指针、长度、容量,append 可能触发扩容并更换底层数组。

map 是哈希表,写入前需要初始化,nil map 写入会 panic,遍历顺序是随机的。

7. Panic 三连问:panic 会怎样 / HTTP 服务中 panic 怎么处理 / 什么情况容易 panic#

panic 会中断当前 goroutine 的正常执行,并依次执行 defer,遇到 recover 可以恢复。

HTTP 服务里通常加 recover 中间件,记录日志、堆栈、请求信息,然后返回 500。

常见 panic 场景有空指针、数组越界、nil map 写入、类型断言失败、关闭已关闭的 channel。

8. MySQL vs Redis 数据分类#

MySQL 适合存核心业务数据,比如用户、帖子、关系、订单、配置等需要事务和持久化的数据。

Redis 适合存热点数据、缓存、计数器、排行榜、分布式锁、会话、Feed 临时数据等高频访问数据。

9. 单实例除了 Redis 还有什么缓存方案?#

单实例缓存还可以用进程内缓存,比如 Go 的 map + mutex、sync.Map、LRU Cache、BigCache、FreeCache。它访问速度快,适合单机热点数据、配置缓存、短生命周期结果缓存。

10. 缓存重建并发竞争怎么解决?#

缓存重建并发竞争可以用互斥锁、singleflight、分布式锁、逻辑过期。常见做法是同一个 key 只有一个请求查库并重建缓存,其他请求等待或返回旧值。

11. Redis 数据结构及应用场景#

String 可做缓存、计数器、分布式锁。

Hash 可存对象字段,比如用户信息。

List 可做简单队列。

Set 可做去重、关注关系、共同好友。

ZSet 可做排行榜、Feed 时间线、延迟队列。

12. MySQL 索引:聚簇/非聚簇、回表、命中判断、覆盖索引#

InnoDB 主键索引是聚簇索引,叶子节点存整行数据。

普通二级索引是非聚簇索引,叶子节点存索引列和主键值,查询其他列时根据主键再查一次,这就是回表。

判断索引命中看查询条件是否符合最左前缀、字段类型是否一致、是否对字段做函数计算。

覆盖索引指查询字段都在索引里,可以直接从索引返回。

13. 介绍一下 Feed 流项目#

Feed 流项目主要实现用户发布内容、关注关系、时间线拉取和缓存优化。核心设计是根据业务选择推模式、拉模式或推拉结合:活跃用户可以推送到收件箱,大 V 可以按需拉取。项目里会用 MySQL 存关系和内容,用 Redis 缓存时间线、计数和热点数据。

14. 有本地缓存为什么还要 Redis?#

本地缓存速度最快,适合减少 Redis 压力;Redis 提供跨实例共享、统一失效、更大容量和丰富数据结构。线上多实例部署时,Redis 能保证各节点看到相对一致的缓存结果。

15. 分布式多实例本地缓存的问题#

多实例本地缓存会带来一致性问题:A 实例更新了缓存,B 实例还保留旧值。常见解决方式是设置较短 TTL、用 Redis 做二级缓存、通过消息广播失效事件,或者把强一致数据集中到 Redis。

16. RabbitMQ 解决什么问题?#

RabbitMQ 主要解决异步解耦、削峰填谷、失败重试和系统间消息传递。比如用户发帖后,写主流程先返回,后续的 Feed 分发、通知、统计通过消息异步处理。

17. 用 goroutine / 任务表 / Redis 实现异步#

异步可以用 goroutine、定时任务、数据库任务表、Redis Stream/List。数据库任务表适合可靠性要求高的场景:写业务数据时顺便写任务记录,再由 worker 扫描执行。

18. 消费者失败处理 & 快照机制#

消费失败可以重试、进入死信队列、记录失败表,再配合告警和人工补偿。

快照机制可以在任务消息里带上当时需要处理的数据版本,消费端按快照执行,减少后续数据变化带来的歧义。

19. RabbitMQ 消息确认机制#

RabbitMQ 的 ack 机制用于确认消息消费成功。手动 ack 模式下,消费者处理成功后 ack;失败时 nack 或 reject,可以选择重新入队或进入死信队列。这样能提升消息处理的可靠性。

20. 反问:对实习生的要求?#

可以问:团队对实习生更看重哪些能力,比如基础、项目经验、学习速度、代码质量还是线上问题处理能力?实习生入职后通常会参与哪些模块?

21. 反问:内部用 AI 提效吗?#

可以问:团队内部会用 AI 做代码生成、单测生成、接口文档、日志分析或研发流程提效吗?我自己平时会用 AI 辅助查资料、生成样例、解释报错和做代码 review。

22. 怎么看加班?#

我接受阶段性加班,比如版本上线、线上问题、关键节点。更看重目标清晰和效率稳定,平时会尽量把任务拆清楚、提前暴露风险,关键时刻能顶上去。

23. 长期做后端还是可能会变?#

我的主线会先放在后端开发上,持续积累服务端、数据库、缓存、消息队列和分布式能力。AI 背景会成为加分项,后续在智能化业务、推荐、数据处理、AI 工程化方向也能结合起来。

内容反馈

发现错误或想补充内容?

GoClub 是静态知识库,评论功能不再加载第三方脚本。你可以在 GitHub 仓库提交 Issue,反馈会直接进入项目协作流程。

提交 GitHub 反馈