目录

Go面经

Go面经

目录

语言基础

  • make和new的差别, 引用类型的意义
  • map不初始化使用会怎么样
  • map不初始化长度和初始化长度的区别
  • map承载多大,大了怎么办
  • map的iterator是否安全?能不能一边delete一边遍历?
  • 字符串不能改,那转成数组能改吗,怎么改
  • 怎么判断一个数组是否已经排序
  • 普通map如何不用锁解决协程安全问题
  • array和slice的区别
  • 零切片、空切片、nil切片是什么
  • slice深拷贝和浅拷贝
  • map触发扩容的时机,满足什么条件时扩容?
  • map扩容策略是什么
  • go struct能不能比较?
  • map如何顺序读取?
  • go中怎么实现set
  • Golang 有没有 this 指针?
  • Golang 中的引用类型包含哪些?
  • 使用range 迭代 map 是有序的吗?
  • 解析 JSON 数据时,默认将数值当做哪种类型
  • array 类型的值作为函数参数是引用传递还是值传递?
  • 在循杯内执行 defer 语句会发生什么?
  • switch 中如何强制执行下一个 case 代码块?
  • 逃逸分析
  • channel的实现
  • Goroutine调度策略
  • GMP与GC(重点问题: 网络IO等待队列,读写屏障)
  • map的实现 (重点问题: sync.map的实现, map实现随机的方法)
  • 高并发下的锁与map读写问题
  • 多协程查询切片问题
  • 对已经关闭的chan进行读写会怎么样? 为什么?
  • 字符串转成byte数组, 会发生内存拷贝吗?
  • http包的内存泄露
  • channel 是怎么保证线程安全?
  • 垃圾回收的过程是怎么样的?
  • 什么是写屏障、混合写屏障,如何实现?
  • 为什么gc会让程序变慢
  • 开多个线程和开多个协程会有什么区别
  • 两个interface{} 能不能比较
  • 接口是怎么实现的?
  • 为什么小对象多了会造成 gc 压力?

MySQL

  • 为什么用b+树不用b树
  • 对MVCC的理解
  • 幻读是怎么解决的
  • redo undo 的作用和实现
  • 事务的实现
  • 索引怎么建
  • 联合索引最左前缀
  • 聚簇索引与回表

Redis

  • 基础数据结构
  • 底层数据结构实现 (重点问题: 压缩列表)
  • 持久化的原理及优化
  • 内存淘汰算法实现
  • 主从复制原理
  • aof与rdb (重点问题: aof重写机制)
  • 为什么用跳表
  • 分布式锁与RedLock
  • 三种分布式的结构
  • 大Key

Mq+ES+分布式

  • kafka的零拷贝和顺序IO零拷贝[零拷贝最好说说细节, 用户空间和内核空间mmap]
  • kafka的分片, 分片的读一致性和写一致性怎么保证
  • ES的倒排索引, 分片的查询召回
  • 分布式锁 redis redlock etcd
  • 分布式事务 2pc 3pc tcc
  • 分布式共识协议 raft和paxos
  • 分布式数据库CAP BASE的概念 etcd tidb的了解

K8s

  • k8s的应用和架构
  • 监控prometheus
  • 微服务架构的内容 (例如服务发现, 链路追踪的工具)

算法

  • 字符串之实现 Sunday 匹配
  • 字符串泄漏之反转字符串(301)
  • 字符串中的第一个唯一字符
  • 字符串之验证回文串
  • 滑动窗口最大值
  • 最长公共前缀
  • 两个数组的交集
  • 最接近的三数之和

排序算法

  • 冒泡
  • 选择