一面
一面只问了一些基础的问题。
自我介绍
数组、链表、栈、队列、二叉树的特点和使用场景
数组和链表的逆序
快速排序,归并排序
第二个项目为什么用Golang
channel
map、实现线程安全
锁
redis基本数据类型
缓存击穿、缓存雪崩、缓存穿透
有没有面其他的厂,收到offer?
为什么百度面试挂了
反问:业务场景、对于转岗的看法
二面
一面之后直接就二面了,效率很高,二面的面试官也很好,会带着一步步讲解。二面大多数是结合具体的场景来说,延伸一些八股,项目说的很少。
对于第二个项目的应用层的map是怎么解决并发冲突的(高性能)
第一个项目中的令牌桶中的lua脚本的实现逻辑
defer的特性
func main() { for i := 0; i < 10; i++ { defer println(i) } }
值接收器和指针接收器与接口的关系,哪一行会报错值类型、指针类型接收器和接口类型赋值总结
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出现的次数