写点什么

薪资 20-40K ,坐标北京,高级 golang 开发岗面经

作者:王中阳Go
  • 2025-04-21
    北京
  • 本文字数:2870 字

    阅读完需:约 9 分钟

薪资 20-40K ,坐标北京,高级golang开发岗面经

新的一周,继续分享最新的面经。


今天分享的是坐标北京的 golang 高级开发工程师岗位的一面面经,整体面的比较广,但是细节拷打不多,不够深入,来学习一下吧:



  1. 自我介绍



2. context 的应用场景

context的典型应用场景包括:


  • 控制请求生命周期:用于 HTTP 请求等场景,当请求被取消或超时时,通过ctx.Done()终止关联操作,避免资源浪费(如用户中途取消请求时,及时停止后台任务)。

  • 处理超时与截止时间:为操作设置超时阈值(如context.WithTimeout),确保长时间运行的任务不会阻塞系统(如 API 调用若超过 2 秒未响应则返回错误)。

  • 传递元数据:在请求链路中传递上下文信息(如用户身份、追踪 ID),方便日志记录、鉴权或分布式调用的上下文传递。



3. channel 是并发安全的吗

channel是线程安全的,内置互斥锁机制,允许多个 Goroutine 并发读写而无需手动加锁。但需注意:


  • 关闭操作:必须由单一 Goroutine 执行关闭,否则引发panic(如close of closed channel)。

  • 避免死锁:确保生产者和消费者平衡,例如发送数据后及时关闭通道,防止读取方无限阻塞。



4. 什么情况会出现 panic

panic的常见触发场景包括:


  • 运行时错误:如除以零、访问空指针(nil)、索引越界、内存分配失败等。

  • 手动触发:显式调用panic("错误信息")用于异常终止程序。

  • 违反语言规范:如接口类型断言失败或channel被重复关闭。



5. 垃圾回收机制了解吗

垃圾回收(GC)是语言自动管理内存的机制,核心原理是:


  • 标记不可达对象:从根对象(全局变量、栈变量)出发,遍历引用链,标记存活对象。

  • 回收未标记对象:释放未被标记的内存空间。

  • 优势:简化内存管理,减少手动分配/释放的错误;挑战:GC 线程运行可能引发短暂性能波动(如“停顿”问题)。



6. GC 什么时候触发

GC 触发的条件包括:


  • 堆内存阈值:当分配的堆内存达到预设比例(如超过 50%)时自动触发。

  • 时间周期:距离上次 GC 超过 2 分钟(默认runtime.forcegcperiod)。

  • 手动调用:通过runtime.GC()显式触发。



7. 线程和进程的区别

  • 资源占用:进程独立资源(内存、文件句柄),开销大,切换慢;线程共享进程资源,轻量级,切换更快。

  • 调度与隔离:进程由操作系统级隔离,故障不影响其他进程;线程同一进程内,崩溃可能影响整个进程。

  • 通信方式:进程间通信(IPC)需通过管道、共享内存等;线程间可直接访问共享内存或通过同步机制(如锁)。



8. 线程和协程的区别

  • 调度方式:线程由操作系统调度,切换依赖内核;协程(如 Go 的 Goroutine)由用户态调度(语言运行时管理),切换更快。

  • 资源消耗:线程需分配固定栈空间(如 1MB);协程栈空间动态扩展,初始分配小(如 2KB)。

  • 适用场景:线程适合需直接操作硬件或资源隔离的场景;协程适合高并发场景(如处理千级并发请求)。



9. 用过哪些设计模式?策略模式用在什么场景?

常用设计模式


  • 工厂模式:动态创建对象(如根据配置选择数据库驱动)。

  • 单例模式:确保全局唯一实例(如日志记录器)。

  • 观察者模式:实现事件订阅与通知(如 UI 组件更新)。

  • 策略模式:用于需动态切换算法或行为的场景,例如支付系统支持多种支付方式(支付宝、微信、银联),通过策略模式选择具体实现,解耦业务逻辑与算法实现,便于扩展新策略。



10. 面向对象中多态的作用

多态的核心作用是:


  • 子类重写父类方法:通过继承和覆盖(Override),实现“一个接口,多种实现”。

  • 接口编程:允许不同子类以统一方式被调用。

  • 价值:提升扩展性(新增子类无需修改父类)、可维护性(逻辑分散降低耦合)和复用性(共享父类公共功能)。



11. 主键索引和唯一索引的区别

  • 主键索引:列值必须唯一且非空,每张表仅有一个,通常作为数据检索的最优路径。

  • 唯一索引:允许字段为空(但非空值需唯一),表可有多个唯一索引。



12. 事务要满足哪些特性

事务需满足 ACID 原则:


  • 原子性(Atomicity):要么全成功,要么全回滚。

  • 一致性(Consistency):事务前后数据符合业务规则。

  • 隔离性(Isolation):并发事务互不干扰,避免脏读、幻读。

  • 持久性(Durability):提交后数据永久保存,即使系统崩溃也能恢复。



13. mysql 是怎么保证持久性的

MySQL 通过以下机制保证持久性:


  • Redo Log:预写日志,先写日志再更新数据,确保崩溃后可恢复。

  • Binlog:记录事务操作,用于主从复制和数据恢复。

  • 事务提交流程:必须等待 Redo Log 和 Binlog 写入磁盘。



14. 默认的隔离级别

MySQL 默认隔离级别为可重复读(REPEATABLE READ)


  • 同一事务内多次查询同一数据结果一致,避免脏读和不可重复读,但可能产生幻读。



15. 数据库在应对高并发要做哪些工作

核心措施包括:


  • 连接池:复用数据库连接,减少创建开销。

  • 索引优化:合理建立索引,避免全表扫描。

  • 分库分表:按业务或数据量水平拆分。

  • 缓存:使用 Redis/Memcached 缓存热点数据。

  • 读写分离:主库处理写,从库分担读压力。

  • 批量操作:合并 SQL 语句减少网络开销。



16. 什么时候不应该建立索引

  • 低选择性字段:如布尔值或重复值多的列。

  • 频繁更新字段:索引会增加写入开销。

  • 小表(如行数<500):全表扫描更快。

  • 文本字段:如长文本不适合索引。



17. 覆盖索引了解吗?怎么知道是否用了覆盖索引

覆盖索引:查询所需字段完全包含在索引中,无需回表查询数据行。


验证方法:通过EXPLAIN语句,若extra列显示Using index,或type列为range/index,则表示使用了覆盖索引。



18. mysql 表中的数据量应该在多大的时候要去分表

当单表查询/更新耗时显著增加(如>1 秒)或数据量超过 500 万行时,需评估分表。具体取决于硬件资源(如内存、磁盘 IOPS)。



19. redis 有哪些数据类型

核心类型包括:


  • String:键值对,支持原子操作。

  • Hash:哈希表,存储对象(如用户信息)。

  • List:有序集合,支持 FIFO/LIFO(如队列)。

  • Set:无序不重复集合,用于去重或交并集运算。

  • Sorted Set:带分数的有序集合,用于排行榜。

  • 其他:Geo(地理位置)、BitMap、HyperLogLog 等。



20. 如何解决缓存击穿

常见方案:


  • 互斥锁:缓存缺失时通过分布式锁(如 Redis 的setnx)防止并发穿透。

  • 缓存空值:存储空值+过期时间,避免短时间重复查询。

  • 本地缓存:结合本地缓存(如 ConcurrentHashMap)兜底。



21. TCP 和 UDP 的区别



22. Https 和 http 的区别

  • 加密:HTTPS 通过 TLS/SSL 加密传输数据,HTTP 为明文传输。

  • 端口:HTTP 默认 80,HTTPS 默认 443。

  • 证书:HTTPS 需服务器证书(由 CA 签发),验证身份。

  • 安全性:防止中间人攻击、数据篡改,保护隐私(如密码、支付信息)。



23. linux 相关命令?如何查看内存?如何查看端口占用?

  • 内存查看

  • free -m:显示内存使用量(MB 单位)。

  • top/htop:实时监控内存及进程资源。

  • vmstat:查看虚拟内存统计信息。

  • 端口占用

  • netstat -tunlp:列出所有监听端口及进程。

  • lsof -i :端口号:查询指定端口的进程。

  • ss -tuln:快速查看套接字状态。



24. mysql 中簇族索引和非簇族索引的区别

  • 簇族索引(聚簇索引)

  • 数据按索引顺序物理存储(如 InnoDB 主键为默认聚簇索引)。

  • 查询主键时效率极高,但更新主键代价大。

  • 非簇族索引(辅助索引)

  • 存储主键值而非数据行,查询需两次寻址(先查索引,再查主键)。




欢迎关注 ❤

我们搞了一个免费的面试真题共享群,互通有无,一起刷题进步。


没准能让你能刷到自己意向公司的最新面试题呢。


感兴趣的朋友们可以加我微信:wangzhongyang1993,备注:面试群。

发布于: 刚刚阅读数: 4
用户头像

王中阳Go

关注

靠敲代码在北京买房的程序员 2022-10-09 加入

【微信】wangzhongyang1993【公众号】程序员升职加薪之旅【成就】InfoQ专家博主👍掘金签约作者👍B站&掘金&CSDN&思否等全平台账号:王中阳Go

评论

发布
暂无评论
薪资 20-40K ,坐标北京,高级golang开发岗面经_Go_王中阳Go_InfoQ写作社区