golang总结(面试前自己需要自己说一遍的问题,且此文持续更新总结)

一、计算机网络

1. http 和 https 的区别

2. 短链接和长连接区别是什么

3. TCP 和 UDP 区别

4. 第二层的协议有什么?

5. http keepalive

6. tcp滑动窗口

7. http2和http1的区别

8. Time_wait了解过吗,它出现在哪个阶段?Time_wait为什么是等待2MSL?

9.

10. 粘包拆包是什么,发生在哪一层

11. 心跳检测如何实现

12.

13.

14. 网络拥塞状态下TCP数据传输,从流量控制角度聊聊

15. udp有发送长度限制吗?

16. http缓存

17. TCP可靠机制

18. TCP的半连接了解吗?

19. cookie和session有什么区别?

20. 对称加密和非对称加密?

21. DNS解析的过程?域名服务器怎么解析?

22. 为什么要等待2MSL

23. 应用层协议了解哪些

24. 传输层协议了解哪些

25. TCP为什么是三次握手,两次不行 ?

26.

二、操作系统

1. 什么是进程什么是线程?区别是什么?

golang总结(面试前自己需要自己说一遍的问题,且此文持续更新总结)_第1张图片

2. 内核态和用户态的区别

  1. 处于用户态执行时,进程所能访问的内存空间和对象受到限制,其所处于占有的处理器是可被抢占的
  2. 处于内核态执行时,则能访问所有的内存空间和对象,且所占有的处理器是不允许被抢占的。

3. io多路复用

4. 介绍一下epoll

5. epoll的边沿触发水平触发?

6. 协程和线程、进程的联系?

一个进程可以拥有多个线程一样,一个线程可以拥有多个协程。线程是最小的执行单元,进程是最小的资源管理单元。无论是进程还是线 程,都是由操作系统所管理的。协程不是被操作系统内核所管理的,而是完全由程序所控制的,即在用户态执行。协程的切换者是用户(编程者或应用程序),切换时机是用户自己的程序来决定的。协程的切换过程只有用户态(即没有陷入内核态),因此切换效率高。

7. 进程中一个线程中出现问题会影响到进程吗?

大部分情况下,其他线程并不会自己崩溃,而是操作系统检测到异常,会kill掉进程,其他线程就一起被干掉了。 小部分情况下,一个线程出错,破坏了进程中其他线程的内存,导致其他线程出现严重错误,被操作系统检测到,然后连同进程一起干掉。

8. fork一个子进程,父进程垮掉了会影响子进程吗?父进程获取不到子进程的id会怎么样?父进程会等待子进程运行完毕吗?

  1. 父进程退出,子进程还在运行的这些子进程都是孤儿进程,孤儿进程将被init进程(1号进程)所收养,并由init进程对他们完成状态收集工作。
  2. 那么它无法直接与子进程进行通信或管理。
  3. 父进程可能会调用等待函数来暂停自己的执行,直到子进程退出。父进程也可以选择不等待子进程的完成,而是继续执行自己的任务。子进程会在父进程退出后成为一个孤儿进程,并由操作系统接管管理。

9. 子进程垮掉会影响父进程吗?然后问到了孤儿进程和僵尸进程?

  1. 如果子进程崩溃或终止,通常不会直接影响父进程。子进程和父进程是独立的进程实体。
  2. 孤儿进程是指其父进程已经终止或不存在的进程。当父进程先于子进程终止时,子进程会成为孤儿进程。
  3. 僵尸进程是指已经终止但仍然存在于进程表中,而其父进程尚未调用wait()或waitpid()等函数来回收子进程资源的进程。
    (tips : 但是如果该进程的父进程已经结束,那该进程就不会变成僵尸进程,因为每个进程结束的时候,系统会扫描所有运行中的进程,看看有没有哪个进程是刚结束的进程的子进程,如果有就由Init来接管他,成为他的父进程。)

10. 协程相对于线程,具体的优势在哪里,具体说一说

  1. 协程切换的开销很小。在协程中,切换由程序员控制,无需涉及内核态的线程切换,因此开销较低。
  2. 因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行效率比多线程高很多。

11. CPU从一个线程切换到另一个线程会发生什么

  1. 上下文保存:当前正在运行的线程的上下文(包括寄存器状态、程序计数器等)会被保存到内存或栈中,以便稍后恢复。
  2. 切换到另一个线程:CPU会从调度器中选择下一个要运行的线程,并将该线程的上下文加载到CPU的寄存器中,以便开始执行该线程的代码。
  3. 执行线程代码:CPU开始执行新线程的指令,恢复该线程在上次切换时的执行状态。

12. 自旋锁和互斥锁

13. 协程切换的时机?

14. 操作系统的死锁?死锁的避免?

三、golang相关

1. go的包管理

2. make和new 的一些区别

3. channel 是可以被 close 的,之后还可以读写吗?

4. channel有什么用

5. map并发安全吗?为什么

6. 子goroutine的panic会不会被父g捕获

7. gc的了解

8. 内存泄漏

9. 怎么样输出一个有序的map

10. map在传参时的类型

11. gmp模型(局部饥饿、全局饥饿、全局缓存队列等)

12. slice深度拷贝

13. interface{}怎么用

14. 说一下go的继承

15. 可以直接对map取地址吗?

16. go中哪些变量是不能比较的。

17. slice和数组有什么区别?

18. slice如何扩容?

19. 往一个关闭的channel里面读数据和写数据会发生什么?

20. golang强类型,弱类型?

21. golang并发控制?

22. map是并发安全的吗?怎么实现并发安全?

23. sync.Map如何解决并发问题?

24. Sync包mutex实现?

25. 一个go-routine最小占多大内存空间?

26. context类型有哪些?Context的作用是什么?context如何实现cancel的?

27. defer的先后顺序

28. select?

29. 协程池怎么实现的

30. channel 了解吗,使用场景?并发安全吗?

31. go语言有哪些优点、特性?

32. go有了协程之后,那它的线程是怎么调度的?(GMP模型)M最多多少个?

33. 线程数量和什么有关系?线程数量是无限大的吗?

34. channel的底层结构?接收、发送消息的过程?

35. 正常模式和饥饿模式?

36. 用Go实现一个死锁

37. 有缓存和无缓存的channel有什么区别?关闭的channel(有和无缓冲)可以读到数据吗?确定吗?分别使用什么场景?多个协程访问会怎么样?

38. GC 原理 (标记清除, 三色标记法, 混合写屏障)?

39. 什么时候会触发 golang GC 呢?

40. channel 你会用在什么地方?

41. golang 如何做超时控制?

42. select 一般使用在什么场景

43. go里面声明一个变量,它是放在栈上还是堆上?

44. defer什么情况下可以修改函数的返回值?

45. 哪些数据类型不能作为map里面的key,哪些可以,有没有什么评判标准?

46. map底层结构

47.

四、MySQL

1. innodb 的一些特点

2. 你还知道一些其他引擎吗

3. MySQL 的索引有哪几种

4. MySQL 的事务有了解吗

5. 你可以给我介绍一下这几个日志(undolog,redolog)和 MVCC 吗?

6. MySQL 中有哪几种锁?

7. 你知道这几种锁的一些区别吗?

8. 索引是越多越好么?

9. 怎么防止sql注入的

10. mysql的联合索引,范围查询,模糊查询一定失效吗?

11. MySQL的常见索引类型有哪些?

12. 什么是聚簇索引?什么是非聚簇索引?

13. 一般选择什么样的字段来建立索引?

14. 索引的目的是什么?

15. 什么情况会影响,降低索引的查询效率?

16. 建立了索引,查询的时候一定会用到索引吗?

17. 什么情况下使用联合索引?

18. B树除了不能满足范围查找的需求外还有哪些缺点呢?

19. 主键索引和唯一索引的区别

20. mysql两种存储引擎的区别和应用场景

21. 什么是事务,特性?

22. 隔离级别?

23. B+树插入分裂的操作是怎么样的

24. 组合索引为什么要最左匹配

25. 组合索引为什么要最左匹配

26. 红黑树特点,和二叉查找树区别

27. B+树和B树区别,mysql为什么不使用B树

28. 为什么不建议使用select *

29. mysql索引优化有了解吗 怎么优化查询

30. 讲一下MySQL范式?

31. MySQL进行一次查询时一定会访问磁盘吗?对MySQL文件的组织有没有了解?

32. Mysql数据放在什么地方?分引擎讨论

33. 主键索引叶子结点存的是什么?

34. MySQL有哪些锁,作用是什么?

35. 死锁是什么,如何避免?

36. Mysql索引下推?

根据二级索引查找到记录之后,先不着急回表,是首先根据其它条件进行筛选,然后再去回表查找完整信息。这样的话就减少了回表次数,也就是减少了随机IO次数。

37. Mysql覆盖索引

38. 为什么索引用 B+树?而不用B树或者二叉树?

39. 说一下什么是幻读?

40. 单表查询数据量比较高,如何优化查询效率?

41. 创建索引的原则?

42. 事务的ACID是怎么实现的

43. Buffer Pool?

设计 InnoDB 的大叔为了缓存磁盘中的页,在 MySQL 服务器启动的时候就向操作系统申请了一片连续的内存,他们给这片内存起了个名,叫做 Buffer Pool。Buffer Pool内部组成:控制块和缓存页和碎片(可能)。free链表:记录一下Buffer Pool中哪些缓存页是可用的。flush链表:修改了 Buffer Pool 中某个缓存页的数据,这些页为脏页,其对应控制块于flush链表中。

44. 索引合并?

主旨:访问二级索引的对应记录为顺序IO,而回表是随机IO,所以想尽量减少回表次数。
Interaction合并:把二级索引的记录进行查找之后,取交集,然后再进行回表。
Union合并:把二级索引的纪录进程查找之后,取并集,然后再进行回表。

45. 表空间?

表空间结构有多个区构成,一个区又由64个页组成。页面类型有很多。每个区对应一个XDES Entry结构,用于存储该区的信息。系统表空间的结构和独立表空间基本类似,只不过由于整个MySQL进程只有一个系统表空间,在系统表空间中会额外记录一些有关整个系统信息的页面。

五、Redis

1. redis使用的协议

2. 说一下五种redis数据结构和之间的实现方式以及使用场景

3. redis的可持久化机制

4. redis实现分布式锁的设计

5. redis 缓存雪崩、击穿、穿透?

6. 缓存雪崩一般怎么解决?

7. bitmap的应用场景有哪些

8. 如果已经发生缓存雪崩,如果服务器也被搞崩溃了,我们怎么恢复网页。(重启服务器之后,先进行限流,等redis重新建立缓存之后,在解除限流。限流方式为令牌桶)

9. redis本身是单线程嘛?

10. redis分布式部署模式?集群模式?哨兵模式原理?

11. redis为什么单线程会快?

12. redis为什么这么快?

13. string底层有了解吗?

14. redis数据怎么设置过期时间,原理是什么,让你来设计过期机制你会怎么设计?

15. redis的hash类型?怎么实现扩容

六、项目(个人)

1. 你是怎么使用 Cron 这个定时任务的?

2. 你是怎么使用 redis 的

3. gorm 有遇到一些坑吗?

4. kafka怎么用的,如何确保消息不丢失。

5. docker和虚拟机有什么区别?

  1. Docker是轻量级虚拟化,只虚拟出容器所需要的资源,而虚拟机是完全虚拟机化,虚拟一整套硬件后,在其运行一个完整的操作系统。
  2. 虚拟机需要独立的操作系统和完整的虚拟化环境,因此占用更多的资源,包括内存、磁盘空间和计算资源。而Docker容器与宿主操作系统共享内核,因此资源占用更少,启动和运行速度更快。
  3. 虚拟机提供了较高的隔离性,每个虚拟机拥有独立的操作系统和内核,可以实现较好的资源隔离和安全性。而Docker容器共享宿主操作系统的内核,隔离性较虚拟机较弱

6. 令牌桶算法原理?

7. 如何防止token被篡改?

8. 雪花算法生成用户ID原理,仔细说说。你觉得和mysql中自增的ID有什么优势。

9. JWT在项目当中是干啥,怎么实现的?

10.

七、算法相关(手撕相关)

1. 冒泡排序和快速排序的时间复杂度是怎样的?

2. 堆排序是不是稳定的?

3. 稳定的排序算法有哪些?

4. 手写快排

5. 前缀树实现

6. 股票买卖问题(如果限制交易数量)

7. 手撕线程池

8. 手撕单例模式(懒汉饿汉)

9. 给定二叉树中序遍历和后续两个数组,求其前序遍历 (讲一下思路,给出答案)

10. 重建二叉树

11. 有序链表转换成二叉搜索树

八、设计模式

(原理?使用场景?)

1.单例模式?

  1. 原理:该模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约资源。
  2. 场景:如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。

2. 迭代器模式?

  1. 原理:迭代器模式提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。
  2. 场景:当你需要访问一个聚集对象,而且不管这些对象是什么都需要遍 历的时候,就应该考虑用迭代器模式。

3. 策略模式?

  1. 原理:定义了算法族,分别封装起来,让它们之间可以互相替换。
  2. 场景:一件事情,有很多方案可以实现。我可以在任何时候,决定采用哪一种实现。未来可能增加更多的方案。 策略模式让方案的变化不会影响到使用方案的客户。

4. 观察者模式?

  1. 原理:定义了对象间一对多依赖,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
  2. 场景:对一个对象状态的更新,需要其他对象同步更新,而且其他对象的数量动态可变。对象仅需要将自己的更新通知给其他对象而不需要知道其他对象的细节。

5.工厂模式

  1. 原理:为创建对象提供了接口。
  2. 场景:在编码时不能预见需要创建哪种类的实例。 系统不应依赖于产品类实例如何被创建、组合和表达的细节。

6. 模板方法模式

  1. 原理:模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些步骤。
  2. 场景:对于一些功能,在不同的对象身上展示不同的作用,但是功能的框架是一样的。

九、Linux

1. Liunx查询哪个CPU占用最大的指令

2. Linux命令查找一个文件的命令

3. 查看本地工作目录的命令

4. 查看端口占用命令

5. Linux进程间通信方式

6. Linux如何创建子进程

7. Linux fork 和 exec的区别

你可能感兴趣的:(golang,网络)