一面

一面只问了一些基础的问题。

  • 自我介绍

  • 数组、链表、栈、队列、二叉树的特点和使用场景

  • 数组和链表的逆序

  • 快速排序,归并排序

  • 第二个项目为什么用Golang

  • channel

  • map、实现线程安全

  • redis基本数据类型

  • 缓存击穿、缓存雪崩、缓存穿透

  • 有没有面其他的厂,收到offer?

  • 为什么百度面试挂了

  • 反问:业务场景、对于转岗的看法

二面

一面之后直接就二面了,效率很高,二面的面试官也很好,会带着一步步讲解。二面大多数是结合具体的场景来说,延伸一些八股,项目说的很少。

  • 对于第二个项目的应用层的map是怎么解决并发冲突的(高性能)

  • 第一个项目中的令牌桶中的lua脚本的实现逻辑

  • defer的特性

    func main() {
       for i := 0; i < 10; i++ {
          defer println(i)
       }
    }
    
  • 值接收器和指针接收器与接口的关系,哪一行会报错值类型、指针类型接收器和接口类型赋值总结open in new window

    type F interface {
    	f()
    }
    type S1 struct {}
    
    func (s S1) f() {}
    
    type S2 struct {}
    
    func (s *S2) f() {}
    func main() {
    	s1Val := S1{}
    	s1Ptr := &S1{}
    	s2Val := S2{}
    	s2Ptr := &S2{}
    	var i F
    	i = s1Val
    	i = s1Ptr
    	i = s2Ptr
    	i = s2Val // error
    	_ = i
    }
    
  • 切片相关问题

    func main() {
       a := make([]int, 0)
       b := make([]int, 0, 1)
       println("address of a: ", a)
       println("address of b: ", b)
       a = append(a, 1)
       b = append(b, 1)
       println("address of a: ", a)
       println("address of b: ", b)
       println(len(a), cap(a))
       println(len(b), cap(b))
    }
    
  • 闭包

    func counter() func() int {
        var i int
        return func() int {
    		i++
            return i
        }
    }
    
    func main(){
        c := counter()
        fmt.PrintIn(c())
        PrintIn(c())
    }
    
  • 向closed的channel中写

    func read(c chan string) {
       <-c
       <-c
    }
    func main() {
       println("hello world")
       c := make(chan string, 1)
       go read(c)
       c <- "hello"
       close(c)
       c <- "world"
       println("hello world")
    }
    
  • channel的死锁

    func main() {
       println("hello world")
       c := make(chan string)
       c <- "world"
       println("hello world")
    }
    
  • redis zset指令时间复杂度:zrange key start end、 zcard key 、zadd

  • 数据库场景

    CREATE TABLE your_table_name (
        id INT PRIMARY KEY AUTO_INCREMENT,
        data VARCHAR(20) INDEX,
        create_time DATETIME
    );
    -- 每日有几十万的数据入库,获取某一天的所有data数据(想要的答案是模拟索引,因为create_time是创建时间,实际上全表就是按照create_time有序排列的,我们可以获取当天的起始和终止点,按照索引的思想范围查询)
    -- 如果加索引会降低插入的效率,并且会锁表
    -- 暂不考虑分库分表
    
  • TCP拥塞控制、慢启动

  • http2 http3优化

  • 10Tb日志文件 urlPath 种类未知 50Mb内存计算出top 10的urlPath和urlPath出现的次数

上次更新:
Contributors: YangZhang