1.说一下go和其他语言的区别

我是最开始是学习c语言的,c语言是面向过程的一种语言,一般用于写底层,性能高,贴合硬件,之后学习很长时间的java,java语言是面向对象语言,简单易入手,当然要学深也是非常难的,java生态非常庞大,阿里系,京东系都市用java的。go语言是一种新兴语言,专门为了微服务而生,写法相当简单,go语言提出了协程的概念,进一步细分了线程,协程的调度是由程序自己进行控制的,并且协程是线程的千分之一,切换开销小,并发度高。

2.说一下你是怎么学Go的

先学习了基础的语法,然后是通过对比学习的,因为学习一个新的语言,会渐渐的忘记以前学过的语言,通过对比学习不仅能学到两者的区别,还能加深学习的印象。

3.说一下Go的调度模型

go语言调度模型是gmp,g表示协程、m表示内核线程、p表示调度器,一般等于内核数,p中有一个本地的g队列,还有一个全局的g队列,m的数量一般大于p的数量,且gmp模型中存在m协程池用来减少m的创建和销毁,m必须和p结合后,才可以进行处理g,先处理p中的本地队列中的g,处理完之后,才会去全局队列中获取g,全局队列中为空的时候,会去其他p中窃取g来执行,每个g执行时间一般不超过10ms,这样能保证其他的g不会因为等太长的时间而出现饿死。gmp会采用窃取和提交来优化gmp的性能。

具体流程是:执行一段go func代码则会创建一个g,g会尝试着加入p中的本地队列,加不进去则会加到全局队列。m必须绑定p,一一对应才可以执行g,m先循环执行p本地队列的g,每个g占用执行时间不超过10ms,防止其他的g饿死,本地的g执行完之后,会去全局队列里面获取g,全局队列中为空之后,在去其他p中去窃取一半的g。当m正在执行某个g的时候发生系统调用,与和当前的m进行解绑,m和当前的g会进行等待,当前的p与寻找空闲的m或者从新创建m继续执行,当m系统调用完之后,会尝试寻找一个空闲的p,并且把g放进去,如果找不到则会将g放入全局队列。

4.讲一下你对channel的理解。没有goroutine在读channel时去写会反发生什么。读的时候呢。channel读的时候是有序还是无序的?

channel是go并发重要的核心之一,可以把chan理解为mutux+队列的组合,其数据结构包含,,,,channel存储数据是有序的,其底层数据结果是一个循环数组。

5.讲一下你对map的理解。map是有序还是无序,如何扩容的,并发安全。

go语言中的map,有hamp和bmap两个结构,采用数组➕链表的形式,通过拉链法来处理冲突,每个bmap最多存储八个键值对,超过之后则通过指针指向下一个bmap。

map中的数据是无序的,需要并发安全的话需要使用sync.map或者配合mutex一起使用。

代补充,,,

6.说一下你学过哪些golang的框架。gin框架怎么实现优雅重启?

可以考虑采用endless来实现优雅的重启

7.讲一下MySQL的索引规范。MySQL有哪些索引类型?索引的底层实现是什么?具体的算法是如何实现的?

索引一般分为主键索引和非主键索引,非主键索引包括普通索引、唯一索引、联合索引等,索引添加的规范一般包括:进行对区分度高的字段添加索引,不能盲目的添加索引,在添加索引的时候根据具体的需求添加不同类型的索引。索引的底层是B+树,为了就是加快检索的效率。

8.MySQL中explain的type种类

system > const > eq_ref > ref > range > index > ALL

9.MySQL的int和tidyint的区别?

tidyint占用1个字节,int占用四个字节。

10.进程间的通信方式?

共享内存、管道、信号量、消息队列、套接字等

11.状态码502,504有什么区别?

502表示网关错误、504表示网关超时

12.讲一下你用过哪些Linux的命令?

最常用的linux命令大全(建议收藏)_海鸥爱上鱼的博客_linux命令行大全

13.sed和awk有什么区别?

sed和awk都是处理文本常用的工具,awk应用的更加广泛,sed是一种面向字符流的编辑器,一行一行的加载到模式空间里面,处理完在进行输出。awk是更像是一种字符模式匹配的语言,其功能很丰富。

14.MySQL规范

MySQL 规约(转自阿里巴巴开发手册)_韩某Hyman的博客