首先感谢盛趣能给我这个上岸的机会,感谢盛趣群里面的小伙伴们。
首先自报下属性,二本大学末流学院,跟牛客很多985大佬差很多,略有自卑。
七月份开始准备秋招,学左老师的算法,然后投递岗位,先后面过几家,盛趣(go服务器offer),旷世(二面结束一直没消息),京东(二面凉),七牛(一面凉)
涂鸦移动(发了offer 拒了),同花顺(刚面完hr),还有一些忘记了,反正就是海投吧,但是偏向于上海岗。
也没什么复习的方式,就是刷题,项目也不多,就三个普通的管理系统。
在牛客呆了这么久,很少看到golang的面经。我个人来说还是因为喜欢golang所以从大一下开始自学golang到现在,也算是有一些自己的心得体会,但是在大佬面前就有些班门弄斧了,
这个面经也不打算写一些关于算法什么的东西,就说golang的问题
--------------------------------------可爱的分割线-------------------------------------------------
golang是一门并发性很强的一门语言,其优点是简单,易用,logo萌。
1.goroutine
go在语言层面支持并发编程 golang 其可以很方便的开启一个并发事务,golang里实现并发的方式是采用goroutine这个东西用来实现,这个东西,应该算是协程的一种
goroutine 这个东西呢算是一个线程中的协程,就好比说,一个进程有N个线程,一个线程有N个协程这样,goroutine可以在一个线程之内创建很多,因为他特别的轻量,
而且goroutine具有自切换特性,他可以在一个goroutine阻塞的时候,golang特有的goroutine调度机制可以切换到另一个goroutine,相比于线程来说,goroutine只有内存所需只有几KB大小,线程则需1MB,
并且创建和销毁的开销更小。
2.Channel
说到了goroutine那就务必说一下他的通信方式
线程和进程的通信方式在此不再赘述。goroutine的通信方式使用CSP模型进行设计,但是并未完全引用整个CSP模型,只取用了其中 process和channel这两个概念,process是在go语言上的表现就是 goroutine 是实际并发执行的实体,每个实体之间是通过channel通讯来实现数据共享。
Channel 在go种分为有缓冲通道与无缓冲通道。
3.切片
golang在语言层面支持切片。
切片是一种对底层数组的一种封装,他可以动态的去扩容底层数组,有点类似与C++中的vector,切片底层是个结构体,其中有三个字段,分别是一个指向底层数组的指针与len元素个数,cap容量三个字段。
切片的添加方式可以采用append函数进行追加,该函数可以向切片尾部新增一个数据,当追加数据超出了cap的值,append会自动扩容,也就是创建一个新的底层数组 然后将原始数组内容放入其中,然后当原始cap值小于1024时进行双倍扩容,大于则1.25倍扩容
切片采用引用传递方式。
4.map映射
golang在语言层面支持map
map是一种类似java种hashmap的东西,底层实现是采用链表法进行实现,遍历时无序输出,可以使用ok-idom方式验证是否key存在,常规遍历必须使用range方式,若想有序遍历map 则需要耗费额外空间,维护一个切片存储key的插入顺序。
5.defer
defer 是golang的一个很神奇的东西,是用来完成golang延迟调用机制的关键字,defer执行顺序是一个栈结构,最先创建的defer 最后输出。
6.panic,recover
有点像java的try catch,我有点讲不太明白,反正就是panic抛出error 然后recover接住,然后处理,如果有多个recover,只有第一个recover能接住panic,后续的接受的都是nil
--------------------------------------可爱的分割线-------------------------------------------------
先写这么多吧,言辞有限,有些东西做得出来也理解的出来就是说不明白,可能是我不善于表达吧。如果有说错的地方请大佬们指出,我会虚心学习。
总之,很感谢牛客网给的这个找工作的平台,也同时祝福所有同学日后工作顺利。