分享
  1. 首页
  2. 文章

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

wangzhongyang007 · · 671 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

新的一周,继续分享最新的面经。 今天分享的是坐标**北京的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的区别 | **特性** | **TCP** | **UDP** | |----------------|----------------------------------|----------------------------------| | **可靠性** | 有(三次握手、重传机制) | 无(丢包不重传) | | **速度** | 较慢(需维护连接状态) | 快(无连接开销) | | **应用场景** | 邮件、HTTP/HTTPS、文件传输 | 视频直播、游戏、实时音视频 | | **头部开销** | 大(20-60字节) | 小(8字节) | --- ### 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**,备注:面试群。

有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
671 次点击
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏