【滴滴】Golang岗-基架秋储实习生面筋

背景:我之前在B站和字节实习过,两份实习用的都是Golang,滴滴这边用的也是Golang
上来简单做了个自我介绍,然后直接开始问问题,全程没有问实习相关和项目相关,问题基本集中在操作系统、计算机网络、数据库和Golang本身,我感觉是因为不同的部门有不同的考察侧重点,可以理解
全程面试官都是以一种和我探讨问题的姿态和我聊天,遇到不会的也会告诉我答案和相关技术,面试体验相当好~
操作系统:

  1. 用户态和内核态
  2. 零拷贝相关,mmap
  • 当时mmap忘了,只说了mmap可以省去一次拷贝orz
  1. 页面逐出算法
  • LRU & LFU
  • LRU的具体实现,LRU的缺点
  1. 知道负载均衡吗?如何实现?
  • 轮询 / 简单哈希 / 一致性哈希
  • 讲了讲一致性哈希
  1. 你从哪知道一致性哈希的?
  • System Design Intervie

计算机网络:

  1. TCP三次握手的详细过程,可不可以只握两次手?
  • SYN flooding
  1. 提到了SYN泛洪攻击,如何防范?
  • 没答出来,只记得可以通过SYN cookie来防范

数据库:

  1. char和varchar
  • 底层行格式的区别
  • 取舍:内存碎片 + 查询效率 / 内存紧凑 + 频繁的系统调用?
  • 面试官说如果是char可以把索引当数组用,但实际业务一般还是用varchar
  1. int(5)这个5代表什么?
  • 答案是显示宽度,当时蒙错咯
  1. 乐观锁和悲观锁的实现
    貌似数据库就问了这么点?我准备半天的MVCC事务锁啥的全都没问

Golang:

  1. 先做了两个代码阅读的题,一个是defer相关的,一个是结构体相关的,不太好描述,就不放上来了
  2. Go如何限制运行Go代码的核心数?
  • 设置GOMAXPROCS全局变量,使其等于自己机器的最大线程数
  1. 如果我有一台64核心的机器,但是设置GOMAXPROCS为8,那么是会只用到这八个核心吗,还是会有多个活跃的核心
  • GMP相关的内容,执行Go代码的核心不固定,同时会出现大于8个核心执行代码的情况出现,因为可能有的线程陷入了系统调用
  1. Go的int是多少位的
  • u1s1,我真忘了…基础还是要补一补哈
  • 答案是根据机器的位长决定,64位机器的话长度就是64bits
  1. Go对于int32和int64的读写操作是原子的吗?
  • 当时答错了,应该都不是原子的
  1. 如果想要实现原子操作应该怎么做?
  • Go提供了Atomic包,这个包实现了这些数据类型的原子操作
  • 底层是用CAS完成的,利用了机器级指令,涉及到缓存一致性问题,当时忘了细说
  1. 那么Go的Map是线程安全的吗?
  • 不是
  1. 如何实现一个线程安全的Map?
  • 先说了一下github上存在的开源实现,这个实现参考了JDK1.7,用的是分段锁
  • 然后又说了下sync.Map,这里说的特别详细,把Go开发者大会上讲的东西详细的说了说,具体适用场景和实现也讲了下,这个sync.Map有点像redis里面用dict用的双map,但又不完全一样
  1. 基本上问完了,做个代码题吧。题目:数字翻转,输入123,输出321,输入-123,输出-321
  • 比较简单,唯一的难点在于判断溢出
  • 我跟面试官分享了一个我的方法,他表示很巧妙,没见过;他也和我分享了一个他的方法,我也没想到hhh,总之交流起来还是很快乐的
  1. 突然表示忘了问redis,布隆过滤器了解吗
  • 说了说是啥

一次愉快的面试就这么结束了~发现自己的基础还是有不足的东西,很多组件都太过专注于高阶的实现和设计思想,反而忽略了最基础的使用层面上的东西,回去需要打打基础了QAQ

发表评论

后才能评论